Як відфільтрувати конкретні програми за наміром ACTION_SEND (і встановити інший текст для кожного додатка)


187

Як ви можете відфільтрувати конкретні програми, використовуючи наміри ACTION_SEND? Це запитання було задано різними способами, але я не зміг зібрати рішення на основі наданих відповідей. Сподіваємось, хтось може допомогти. Я хотів би надати можливість спільного доступу до програми. Слідуючи порадам Android Dev Олександра Лукаса , я вважаю за краще робити це за допомогою намірів, а не за допомогою API Facebook / Twitter.

Спільний доступ за допомогою наміру ACTION_SEND

Спільний доступ за допомогою наміру ACTION_SEND чудовий, але проблема полягає в (1) Я не хочу, щоб кожен параметр спільного доступу там був, я б обмежував його FB, Twitter та електронною поштою, і (2) я не хочу ділитися те саме для кожного додатка для спільного використання . Наприклад, у своїй довірі твіттера я збираюся включити деякі згадки, а хештеги обмежили його 140 символами або менше, тоді як у фейсбук-акції буде включено посилання та зображення функції.

Чи можна обмежити параметри наміру ACTION_SEND (share)? Я бачив щось про використання PackageManager та queryIntentActivities, але не зміг з’ясувати зв’язок між PackageManager та наміром ACTION_SEND.

АБО

Замість того, щоб фільтрувати додатки для спільного використання, мою проблему також можна було б вирішити, якби я міг використати намір ACTION_SEND перейти безпосередньо до facebook чи щебетати, а не вискакувати діалогове вікно. Якби це було так, я міг би створити власне діалогове вікно, і коли вони натискають "Facebook", створити специфічний намір у Facebook та просто надіслати їх до Facebook. Те саме з Twitter.

АБО це не можливо? Є єдиним способом API та Facebook та Twitter?


Можливий дублікат: [призначені для користувача фільтрації-з-наміри Chooser на основі-на встановленій-андроїд-ім'я пакета] [1] [1]: stackoverflow.com/questions/5734678 / ...
Асаф Pinhassi

1
Цей блогпост здається ідеальною відповіддю: hkdevtips.blogspot.com/2013/02/…
Віталій Ольшевський

2
Ей друг ... коли я натискаю кнопку "Надіслати", тоді відкриваю діалогове вікно спільного доступу та спільний діалоговий список "gmail, email, zapiya, hookup" тощо. але не показуючи facebook, WhatsApp, фейсбук-мессанжер, походи в тусовки ... як я можу показати його ??
GB_Bhayani ツ

як не показувати вибір, коли на android 6.0 є лише один предмет / варіант наміру дії? проблема не відображається менше ніж на android 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 та Bluetooth.

Сподіваюся, що це комусь допоможе.

Редагувати: У коментарі мене попросили пояснити, що робить цей код. В основному, це створення ACTION_SENDнаміру ТІЛЬКИ для нативного клієнта електронної пошти, а потім приєднання інших намірів до вибору. Здійснюючи оригінальний електронний намір, що стосується електронної пошти, позбавляється від усіх зайвих сміттів, таких як wifi та bluetooth, тоді я захоплюю інші потрібні наміри із загального ACTION_SENDтипу простого тексту та виконую їх дії, перш ніж показувати вибір.

Коли я захоплюю додаткові наміри, я встановлюю персональний текст для кожного.

Edit2: З моменту публікації цього часу минуло деякий час, і все дещо змінилося. Якщо ви переглядаєте gmail двічі у списку параметрів, спробуйте видалити спеціальну обробку для "android.gm", як це запропоновано в коментарі @h_k нижче.

Оскільки ця одна відповідь є джерелом майже всіх моїх репутаційних ставок, я повинен принаймні намагатися її оновлювати.


1
Я використовую цей код, але якось evernote прокрадається до списку. Коли я перевіряю назви пакетів, це com.evernote, тому я не впевнений, чому це відбувається.
Джеймс Харпе

1
@ user2249287 Я б запропонував вам переглядати код, поки ви не побачите додаток для обміну повідомленнями, яке пропускається, а потім подивіться на ім'я пакета, щоб визначити, яку рядок потрібно додати до білого списку цього додатка.
dacoinminster

1
@Gilbou Привіт! Вибачте - минуло давно, як я подивився на цей код. . . Як я пам'ятаю, команда setPackage вибирає єдиний намір, до якого ви додасте все інше. Щоб включити або виключити різні інші наміри, рекомендую переглядати код і подивитися назви пакунків.
dacoinminster

2
Щоб відфільтрувати ТІЛЬКІ додатки електронної пошти, якими користувач користується, ви можете скористатися другою відповіддю з цього питання: stackoverflow.com/questions/8701634/send-email-intent . Це не вимагає використання типу даних message / rfc822, які використовують і інші програми, такі як EverNote в цьому випадку.
mpellegr

2
@dacoinminster ваш код був приголомшливим, тому що я дозволяв мені визначати різний текст для таких додатків, як Twitter і Whatsapp. Щоб видалити дублікат gmail, я просто вийняв "android.gm" з рівняння. Я все ще отримую gmail та вбудований додаток пошти у списку вибору, а тема та текст залишаються недоторканими.
h_k

26

Якщо ви хочете налаштувати опцію, то не слід покладатися на діалогове вікно за замовчуванням, яке надає Android для цієї дії.

Що потрібно зробити замість цього - це розкрутити своє. Вам потрібно буде задати запит PackageManager, на якому пакунки обробляти потрібну вам дію, а потім на основі відповіді застосовувати фільтрування та налаштований текст.

В Зокрема, зверніть увагу на метод queryIntentActivities в PackageManager класу. Ви будуєте намір, який запустить діалогове вікно за замовчуванням (намір ACTION_SEND), передайте цей метод і отримаєте список об'єктів, що містять інформацію про дії, які можуть обробляти цей намір. Використовуючи це, ви можете вибрати потрібні.

Після створення списку пакунків, які ви хочете представити, вам потрібно створити власний діалог списку (бажано, діяльність із темою діалогу), який відображатиме цей список.

Хоча слід зазначити, що дуже складно зробити цей спеціальний діалог схожим на стандартний. Проблема полягає в тому, що тема, що використовується в цьому діалоговому вікні, є внутрішньою темою і не може бути використана вашою програмою. Ви можете спробувати зробити його таким же подібним до рідного, як вам завгодно, або перейти на повністю спеціальний вигляд (багато додатків роблять це, як додаток галереї тощо)


1
Позначення цієї відповіді правильною, оскільки вона найбільше відповідає на початкове запитання, навіть якщо я перейшов іншим маршрутом (див. Мою відповідь). Дякую.
Кайл Клегг

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 і використовує його для публікації твіт. Примітка. Це не дає вам наміру з різними клієнтами Twitter і дозволяє вам обирати.

Поділитися за допомогою 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 р.).

Джерело коду: Намір відкрити клієнт Twitter на Android


4
Мені ця відповідь не подобається, тому що вона покладається на те, щоб знати назви пакетів усіх програм Twitter. Інший спосіб див. Stackoverflow.com/questions/6827407/…
Ед Бернет

Я згоден з вами, хоча відповідь, з якою ви пов’язали, має подібну проблему. Мені ніколи не подобається покладатися на порівняння рядків, особливо коли я не маю контролю або гарантую, що струна не зміниться.
Кайл Клегг

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 ")) {продовжити;}?
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 + та інший варіант, який містить додатки для перегляду
Sunishtha Singh

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
}

І це посилання на його суть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.