ACTION_SEND 의도에 따라 특정 앱을 필터링하고 각 앱마다 다른 텍스트를 설정하는 방법


187

ACTION_SEND 인 텐트를 사용할 때 특정 앱을 어떻게 필터링 할 수 있습니까? 이 질문은 여러 가지 방법으로 요청되었지만 주어진 답변을 기반으로 해결책을 모을 수 없었습니다. 누군가가 도울 수 있기를 바랍니다. 앱 내에서 공유 할 수있는 기능을 제공하고 싶습니다. 다음은 안드로이드 데브 알렉산더 루카스의 조언 , 나는 페이스 북 / 트위터 API를 사용하여 의도를 사용하지 않는 것을 선호 것입니다.

ACTION_SEND 의도를 사용하여 공유

ACTION_SEND 의도를 사용하여 공유하는 것은 좋지만 문제는 (1) 모든 공유 옵션을 원하지 않고 FB, Twitter 및 이메일로 제한하고 (2) 공유하고 싶지 않다는 것입니다 각 공유 응용 프로그램과 동일한 것 . 예를 들어, 트위터 공유에서 일부 언급과 해시 태그를 140 자 이하로 제한하고 페이스 북 공유에는 링크와 기능 이미지가 포함됩니다.

ACTION_SEND (공유) 의도에 대한 옵션을 제한 할 수 있습니까? PackageManager와 queryIntentActivities를 사용하는 것에 대해 보았지만 PackageManager와 ACTION_SEND 의도 사이의 연결을 파악할 수 없었습니다.

또는

공유 응용 프로그램을 필터링하는 대신 ACTION_SEND 의도를 사용하여 대화 상자를 팝업하는 대신 페이스 북이나 트위터로 직접 이동할 수 있으면 문제가 해결 될 수도 있습니다. 이 경우에는 내 대화 상자를 만들 수 있고 "Facebook"을 클릭하면 Facebook 전용 인 텐트를 만들어 Facebook으로 보낼 수 있습니다. 트위터와 동일합니다.

아니면 불가능합니까? Facebook 및 Twitter API가 유일한 방법입니까?


가능한 중복 : [맞춤 필터링 -의 의도 츄 기반-에 설치 - 안드로이드 패키지 이름] [1] [1] : stackoverflow.com/questions/5734678/...
Asaf Pinhassi

1
이 블로그 게시물은 완벽한 해답이 될 것 같다 : hkdevtips.blogspot.com/2013/02/...
비탈리 Olshevski

2
안녕하세요 친구 ... 내 보내기 버튼을 클릭하면 공유 대화 상자가 열리고 공유 대화 상자 목록은 "gmail, 이메일, zapiya, 연결"등입니다. 하지만 페이스 북, whatsapp, 페이스 북 메신저, 행 아웃 하이킹을 표시하지 않는 방법 ... 어떻게 표시 할 수 있습니까 ??
GB_Bhayani ツ

안드로이드 6.0에서 의도적 인 행동의 항목 / 옵션이 하나뿐 일 때 선택자를 표시하지 않는 방법은 무엇입니까? 이 문제는 안드로이드 6.0 미만에서 표시되지 않습니다
zys

답변:


324

내 지식으로는 StackOverflow에는 많은 사람들 이이 질문을 다양한 방법으로 요구하지만 아무도 아직 완전히 대답하지 못했습니다.

내 사양은 사용자가 전자 메일, 트위터, 페이스 북 또는 SMS를 선택할 수 있고 각 사용자 정의 텍스트가 포함되도록 요구했습니다. 내가 그것을 달성 한 방법은 다음과 같습니다.

public void onShareClick(View v) {
    Resources resources = getResources();

    Intent emailIntent = new Intent();
    emailIntent.setAction(Intent.ACTION_SEND);
    // Native email client doesn't currently support HTML, but it doesn't hurt to try in case they fix it
    emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_native)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));
    emailIntent.setType("message/rfc822");

    PackageManager pm = getPackageManager();
    Intent sendIntent = new Intent(Intent.ACTION_SEND);     
    sendIntent.setType("text/plain");


    Intent openInChooser = Intent.createChooser(emailIntent, resources.getString(R.string.share_chooser_text));

    List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
    List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();        
    for (int i = 0; i < resInfo.size(); i++) {
        // Extract the label, append it, and repackage it in a LabeledIntent
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;
        if(packageName.contains("android.email")) {
            emailIntent.setPackage(packageName);
        } else if(packageName.contains("twitter") || packageName.contains("facebook") || packageName.contains("mms") || packageName.contains("android.gm")) {
            Intent intent = new Intent();
            intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            if(packageName.contains("twitter")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_twitter));
            } else if(packageName.contains("facebook")) {
                // Warning: Facebook IGNORES our text. They say "These fields are intended for users to express themselves. Pre-filling these fields erodes the authenticity of the user voice."
                // One workaround is to use the Facebook SDK to post, but that doesn't allow the user to choose how they want to share. We can also make a custom landing page, and the link
                // will show the <meta content ="..."> text from that page with our link in Facebook.
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_facebook));
            } else if(packageName.contains("mms")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_sms));
            } else if(packageName.contains("android.gm")) { // If Gmail shows up twice, try removing this else-if clause and the reference to "android.gm" above
                intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_gmail)));
                intent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));               
                intent.setType("message/rfc822");
            }

            intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        }
    }

    // convert intentList to array
    LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]);

    openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    startActivity(openInChooser);       
}

나는 여러 곳 에서이 작업을 수행하는 방법을 조금 찾았지만 다른 곳에서는 모든 것을 보지 못했습니다.

이 방법은 Wi-Fi 및 블루투스를 통한 공유와 같이 원하지 않는 모든 바보 같은 옵션도 숨 깁니다.

이것이 누군가를 돕기를 바랍니다.

편집 : 의견 에서이 코드의 기능을 설명하라는 요청을 받았습니다. 기본적으로 ACTION_SEND기본 이메일 클라이언트 전용 인 텐트를 만든 다음 다른 인 텐트를 선택자에게 전달합니다. 원래의 인 텐트 전자 우편을 특정하게 만들면 wifi 및 블루투스와 같은 추가 쓰레기를 모두 제거한 다음 ACTION_SEND일반 텍스트 유형의 일반 텍스트 에서 원하는 다른 인 텐트를 가져 와서 선택자를 표시하기 전에이를 고정시킵니다.

추가 의도를 파악할 때 각 사용자 정의 텍스트를 설정합니다.

편집 2 : 이 게시물을 게시 한지 오래 되었지만 상황이 약간 변경되었습니다. 옵션 목록에 gmail이 두 번 표시되면 아래 @h_k의 설명에 제안 된대로 "android.gm"에 대한 특수 처리를 제거하십시오.

이 답변은 거의 모든 스택 오버 플로우 평판 포인트의 원천이므로 적어도 최신 상태로 유지해야합니다.


1
이 코드를 사용하고 있지만 어쨌든 목록에 몰래 들어가고 있습니다. 패키지 이름을 확인하면 com.evernote이므로 이것이 왜 발생하는지 잘 모르겠습니다.
제임스 하페

1
@ user2249287 건너 뛰는 메시징 앱이 나타날 때까지 코드를 단계별로 살펴본 다음 패키지 이름을보고 해당 앱을 허용 목록에 추가해야하는 문자열을 확인하십시오.
dacoinminster

1
@Gilbou 안녕하세요! 죄송합니다.이 코드를 살펴본 후 오랜 시간이 걸렸습니다. . . 내가 기억 하듯이 setPackage 명령은 다른 모든 것을 추가 할 단일 의도를 선택합니다. 다양한 다른 의도를 포함하거나 제외하려면 코드를 단계별로 실행하고 패키지 이름을 확인하는 것이 좋습니다.
dacoinminster 2016 년

2
사용자가 가지고있는 전자 메일 앱만 필터링하려면이 질문의 두 번째 답변 인 stackoverflow.com/questions/8701634/send-email-intent를 사용할 수 있습니다 . 이 경우 EverNote와 같은 다른 앱에서도 사용하는 message / rfc822의 데이터 유형을 사용할 필요가 없습니다.
mpellegr

2
@dacoinminster 귀하의 코드는 Twitter 및 Whatsapp와 같은 앱에 대해 다른 텍스트를 정의 할 수있게 해주었습니다. 중복 Gmail을 제거하기 위해 방금 방정식에서 "android.gm"을 제거했습니다. 여전히 선택기 목록에 Gmail과 기본 제공 메일 앱이 있으며 제목과 텍스트는 그대로 유지됩니다.
h_k 2016 년

26

사용자 정의 옵션을 원한다면이 작업을 위해 android에서 제공하는 기본 대화 상자에 의존해서는 안됩니다.

대신해야 할 일은 직접 배포하는 것입니다. 당신은 쿼리해야합니다 패키지 매니저 , 당신은 필터링 및 사용자 정의 텍스트 적용 패키지는 응답에 따라 다음 필요로하고 작업을 처리하는합니다.

특히, 메소드를 살펴 걸릴 queryIntentActivities패키지 매니저의 클래스를. 기본 대화 상자 (ACTION_SEND 의도)를 시작하려는 의도를 빌드하고이 메소드에 전달하면 해당 의도를 처리 할 수있는 활동에 대한 정보가 포함 된 오브젝트 목록이 수신됩니다. 이를 사용하여 원하는 것을 선택할 수 있습니다.

제시하려는 패키지 목록을 작성하면 해당 목록을 표시 할 고유 한 목록 대화 상자 (바람직하게는 대화 상자 테마가있는 활동)를 작성해야합니다.

그러나 사용자 지정 대화 상자를 기본 대화 상자처럼 보이게 만드는 것은 매우 어렵다는 점에 유의하십시오. 문제는 해당 대화 상자에 사용 된 테마가 내부 테마이므로 응용 프로그램에서 사용할 수 없다는 것입니다. 원하는대로 기본 모양과 비슷하게 만들거나 완전히 사용자 정의 모양을 만들 수 있습니다 (많은 응용 프로그램은 갤러리 응용 프로그램과 같은 작업을 수행합니다)


1
다른 경로로 이동했지만 원래 답변에 가장 가깝기 때문에이 답변을 올바른 것으로 표시하십시오 (내 답변 참조). 감사.
Kyle Clegg

22

Facebook, Twitter, KakaoStory의 세 가지 앱만 공유하려면이 앱을 사용해보십시오.

public void onShareClick(View v){
    List<Intent> targetShareIntents=new ArrayList<Intent>();
    Intent shareIntent=new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    List<ResolveInfo> resInfos=getPackageManager().queryIntentActivities(shareIntent, 0);
    if(!resInfos.isEmpty()){
        System.out.println("Have package");
        for(ResolveInfo resInfo : resInfos){
            String packageName=resInfo.activityInfo.packageName;
            Log.i("Package Name", packageName);
            if(packageName.contains("com.twitter.android") || packageName.contains("com.facebook.katana") || packageName.contains("com.kakao.story")){
                Intent intent=new Intent();
                intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "Text");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                intent.setPackage(packageName);
                targetShareIntents.add(intent);
            }
        }
        if(!targetShareIntents.isEmpty()){
            System.out.println("Have Intent");
            Intent chooserIntent=Intent.createChooser(targetShareIntents.remove(0), "Choose app to share");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }else{
            System.out.println("Do not Have Intent");
            showDialaog(this);
        }
    }
}

이 코드는 특정 앱과 공유하려고 할 때 완벽하게 작동합니다.
Orcun Sevsay

22

여기를 보고 나에게 맞는 해결책을 찾았습니다 (첫 번째 답변에 대한 세 번째 의견 참조). 이 코드는 유효한 트위터 클라이언트를 찾고이를 사용하여 트윗을 게시합니다. 참고 : 다양한 Twitter 클라이언트와의 의사 소통을 제공하지 않으며 선택할 수 있습니다.

트위터를 사용하여 공유 :

Intent shareIntent = findTwitterClient(); 
shareIntent.putExtra(Intent.EXTRA_TEXT, "test");
startActivity(Intent.createChooser(shareIntent, "Share"));

이 메소드를 호출 :

public Intent findTwitterClient() {
    final String[] twitterApps = {
            // package // name - nb installs (thousands)
            "com.twitter.android", // official - 10 000
            "com.twidroid", // twidroid - 5 000
            "com.handmark.tweetcaster", // Tweecaster - 5 000
            "com.thedeck.android" }; // TweetDeck - 5 000 };
    Intent tweetIntent = new Intent();
    tweetIntent.setType("text/plain");
    final PackageManager packageManager = getPackageManager();
    List<ResolveInfo> list = packageManager.queryIntentActivities(
            tweetIntent, PackageManager.MATCH_DEFAULT_ONLY);

    for (int i = 0; i < twitterApps.length; i++) {
        for (ResolveInfo resolveInfo : list) {
            String p = resolveInfo.activityInfo.packageName;
            if (p != null && p.startsWith(twitterApps[i])) {
                tweetIntent.setPackage(p);
                return tweetIntent;
            }
        }
    }

    return null;
}

Facebook은 " com.facebook.katana "를 사용하여 비슷 하지만 메시지 텍스트를 설정할 수는 없지만 (2011 년 7 월 더 이상 사용되지 않음)

코드 소스 : Android에서 Twitter 클라이언트를 열 의도


4
모든 트위터 앱의 패키지 이름을 아는 것에 의존하기 때문에이 답변이 마음에 들지 않습니다. 다른 방법은 stackoverflow.com/questions/6827407/…
Ed Burnette

귀하의 답변에 비슷한 문제가 있지만 귀하에게 동의합니다. 나는 제어가 없거나 문자열이 변경되지 않을 때 특히 문자열 비교에 의존하는 것을 좋아하지 않습니다.
Kyle Clegg

11

@dacoinminster에게 감사합니다. 인기있는 앱의 패키지 이름과 해당 앱의 정렬을 포함하여 그의 답변을 수정했습니다.

List<Intent> targetShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> resInfos = pm.queryIntentActivities(shareIntent, 0);
if (!resInfos.isEmpty()) {
    System.out.println("Have package");
    for (ResolveInfo resInfo : resInfos) {
        String packageName = resInfo.activityInfo.packageName;
        Log.i("Package Name", packageName);

        if (packageName.contains("com.twitter.android") || packageName.contains("com.facebook.katana")
                || packageName.contains("com.whatsapp") || packageName.contains("com.google.android.apps.plus")
                || packageName.contains("com.google.android.talk") || packageName.contains("com.slack")
                || packageName.contains("com.google.android.gm") || packageName.contains("com.facebook.orca")
                || packageName.contains("com.yahoo.mobile") || packageName.contains("com.skype.raider")
                || packageName.contains("com.android.mms")|| packageName.contains("com.linkedin.android")
                || packageName.contains("com.google.android.apps.messaging")) {
            Intent intent = new Intent();

            intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
            intent.putExtra("AppName", resInfo.loadLabel(pm).toString());
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT, "https://website.com/");
            intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_text));
            intent.setPackage(packageName);
            targetShareIntents.add(intent);
        }
    }
    if (!targetShareIntents.isEmpty()) {
        Collections.sort(targetShareIntents, new Comparator<Intent>() {
            @Override
            public int compare(Intent o1, Intent o2) {
                return o1.getStringExtra("AppName").compareTo(o2.getStringExtra("AppName"));
            }
        });
        Intent chooserIntent = Intent.createChooser(targetShareIntents.remove(0), "Select app to share");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
        startActivity(chooserIntent);
    } else {
        Toast.makeText(getActivity(), "No app to share.", Toast.LENGTH_LONG).show();
    }
}

9

아래 코드를 시도하면 완벽하게 작동합니다.

여기서는 Facebook, Messenger, Twitter, Google Plus 및 Gmail과 같은 특정 앱과 공유합니다.

public void shareIntentSpecificApps() {
        List<Intent> intentShareList = new ArrayList<Intent>();
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(shareIntent, 0);

        for (ResolveInfo resInfo : resolveInfoList) {
            String packageName = resInfo.activityInfo.packageName;
            String name = resInfo.activityInfo.name;
            Log.d(TAG, "Package Name : " + packageName);
            Log.d(TAG, "Name : " + name);

            if (packageName.contains("com.facebook") ||
                    packageName.contains("com.twitter.android") ||
                    packageName.contains("com.google.android.apps.plus") ||
                    packageName.contains("com.google.android.gm")) {

                if (name.contains("com.twitter.android.DMActivity")) {
                    continue;
                }

                Intent intent = new Intent();
                intent.setComponent(new ComponentName(packageName, name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject");
                intent.putExtra(Intent.EXTRA_TEXT, "Your Content");
                intentShareList.add(intent);
            }
        }

        if (intentShareList.isEmpty()) {
            Toast.makeText(MainActivity.this, "No apps to share !", Toast.LENGTH_SHORT).show();
        } else {
            Intent chooserIntent = Intent.createChooser(intentShareList.remove(0), "Share via");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentShareList.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }
    }

"if (name.contains ("com.twitter.android.DMActivity ")) {continue;}의 이유는 무엇입니까?}
isJulian00

8

이 솔루션은 ListView 대화 상자에 선택기와 유사한 응용 프로그램 목록을 보여줍니다.

스크린 샷

그것은 당신에게 달려 있습니다 :

  1. 관련 응용 프로그램 패키지 목록을 얻습니다.
  2. 패키지 이름이 주어지면 관련 의도를 불러옵니다.

어댑터 클래스 :

import java.util.List;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ChooserArrayAdapter extends ArrayAdapter<String> {
    PackageManager mPm;
    int mTextViewResourceId;
    List<String> mPackages;

    public ChooserArrayAdapter(Context context, int resource, int textViewResourceId, List<String> packages) {
        super(context, resource, textViewResourceId, packages);
        mPm = context.getPackageManager();
        mTextViewResourceId = textViewResourceId;
        mPackages = packages;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String pkg = mPackages.get(position);
        View view = super.getView(position, convertView, parent);

        try {
            ApplicationInfo ai = mPm.getApplicationInfo(pkg, 0);

            CharSequence appName = mPm.getApplicationLabel(ai);
            Drawable appIcon = mPm.getApplicationIcon(pkg);

            TextView textView = (TextView) view.findViewById(mTextViewResourceId);
            textView.setText(appName);
            textView.setCompoundDrawablesWithIntrinsicBounds(appIcon, null, null, null);
            textView.setCompoundDrawablePadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getContext().getResources().getDisplayMetrics()));
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        return view;
    }

}

그리고 그 사용법 :

    void doXxxButton() {
        final List<String> packages = ...;
        if (packages.size() > 1) {
            ArrayAdapter<String> adapter = new ChooserArrayAdapter(MyActivity.this, android.R.layout.select_dialog_item, android.R.id.text1, packages);

            new AlertDialog.Builder(MyActivity.this)
            .setTitle(R.string.app_list_title)
            .setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item ) {
                    invokeApplication(packages.get(item));
                }
            })
            .show();
        } else if (packages.size() == 1) {
            invokeApplication(packages.get(0));
        }
    }

    void invokeApplication(String packageName) {
        // given a package name, create an intent and fill it with data
        ...
        startActivityForResult(intent, rq);
    }

4

가장 깨끗한 방법은 ShareActionProvider, ActivityChooserView, ActivityChooserModel 클래스를 복사하는 것입니다. ActivityChooserModel에서 의도를 필터링하는 기능과 ShareActionProvider의 적절한 지원 방법을 추가하십시오. 필요한 클래스를 만들었으며 프로젝트에 복사 할 수 있습니다 ( https://gist.github.com/saulpower/10557956 ). 이렇게하면 공유하려는 앱을 필터링하는 기능 (패키지 이름을 알고있는 경우)뿐만 아니라 기록을 해제하는 기능도 추가됩니다.

private final String[] INTENT_FILTER = new String[] {
    "com.twitter.android",
    "com.facebook.katana"
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.journal_entry_menu, menu);

    // Set up ShareActionProvider's default share intent
    MenuItem shareItem = menu.findItem(R.id.action_share);

    if (shareItem instanceof SupportMenuItem) {
        mShareActionProvider = new ShareActionProvider(this);
        mShareActionProvider.setShareIntent(ShareUtils.share(mJournalEntry));
        mShareActionProvider.setIntentFilter(Arrays.asList(INTENT_FILTER));
        mShareActionProvider.setShowHistory(false);
        ((SupportMenuItem) shareItem).setSupportActionProvider(mShareActionProvider);
    }

    return super.onCreateOptionsMenu(menu);
}

나머지 애플리케이션을 포함하는
Google+

3

@dacoinminster 답변을 개선했으며 이는 앱을 공유하는 예제의 결과입니다.

// Intents with SEND action
PackageManager packageManager = context.getPackageManager();
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(sendIntent, 0);

List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
Resources resources = context.getResources();

for (int j = 0; j < resolveInfoList.size(); j++) {
    ResolveInfo resolveInfo = resolveInfoList.get(j);
    String packageName = resolveInfo.activityInfo.packageName;
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setComponent(new ComponentName(packageName,
    resolveInfo.activityInfo.name));
    intent.setType("text/plain");

    if (packageName.contains("twitter")) {
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.twitter) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    } else {
        // skip android mail and gmail to avoid adding to the list twice
        if (packageName.contains("android.email") || packageName.contains("android.gm")) {
            continue;
        }
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForFacebookWhatsapp) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    }

    intentList.add(new LabeledIntent(intent, packageName, resolveInfo.loadLabel(packageManager), resolveInfo.icon));
}

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.subjectForMailApps));
emailIntent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForMailApps) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());

context.startActivity(Intent.createChooser(emailIntent, resources.getString(R.string.compartirEn)).putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new LabeledIntent[intentList.size()])));

3

나는 같은 문제가 있었고이 받아 들여진 해결책은 도움이되지 않았다. 누가 같은 문제가 있다면 코드 스 니펫을 사용할 수있다 .

// example of filtering and sharing multiple images with texts
// remove facebook from sharing intents
private void shareFilter(){

    String share = getShareTexts();
    ArrayList<Uri> uris = getImageUris();

    List<Intent> targets = new ArrayList<>();
    Intent template = new Intent(Intent.ACTION_SEND_MULTIPLE);
    template.setType("image/*");
    List<ResolveInfo> candidates = getActivity().getPackageManager().
            queryIntentActivities(template, 0);

    // remove facebook which has a broken share intent
    for (ResolveInfo candidate : candidates) {
        String packageName = candidate.activityInfo.packageName;
        if (!packageName.equals("com.facebook.katana")) {
            Intent target = new Intent(Intent.ACTION_SEND_MULTIPLE);
            target.setType("image/*");
            target.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
            target.putExtra(Intent.EXTRA_TEXT, share);
            target.setPackage(packageName);
            targets.add(target);
        }
    }
    Intent chooser = Intent.createChooser(targets.remove(0), "Share Via");
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toArray(new Parcelable[targets.size()]));
    startActivity(chooser);

}

3
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
    Uri.fromParts("mailto", "android@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, text);
startActivity(Intent.createChooser(emailIntent, "Send email..."));

0

너무 간단하고 간결합니다. 이 솔루션을 공유 한 오픈 소스 개발자 인 cketti 에게 감사드립니다 .

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
  startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
  //TODO: Handle case where no email app is available
}

그리고 이것은 그 / 그녀의 요지에 대한 링크입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.