Comment filtrer des applications spécifiques pour l'intention ACTION_SEND (et définir un texte différent pour chaque application)


187

Comment pouvez-vous filtrer des applications spécifiques lorsque vous utilisez l'intention ACTION_SEND? Cette question a été posée de différentes manières, mais je n'ai pas été en mesure de trouver une solution basée sur les réponses données. J'espère que quelqu'un pourra vous aider. Je souhaite offrir la possibilité de partager dans une application. Suivant les conseils d'Android Dev Alexander Lucas , je préfère le faire en utilisant des intentions et non en utilisant les API Facebook / Twitter.

Partage à l'aide de l'intention ACTION_SEND

Le partage à l'aide de l'intention ACTION_SEND est excellent, mais le problème est (1) Je ne veux pas toutes les options de partage là-bas, je préfère le limiter à FB, Twitter et E-mail, et (2) Je ne veux pas partager la même chose pour chaque application de partage . Par exemple, dans mon partage Twitter, je vais inclure des mentions et des hashtags limités à 140 caractères ou moins, tandis que le partage Facebook va inclure un lien et une image de fonction.

Est-il possible de limiter les options pour l'intention ACTION_SEND (partage)? J'ai vu quelque chose à propos de l'utilisation de PackageManager et de queryIntentActivities, mais je n'ai pas été en mesure de comprendre la connexion entre PackageManager et l'intention ACTION_SEND.

OU

Plutôt que de filtrer les applications de partage, mon problème pourrait également être résolu si je pouvais utiliser l'intention ACTION_SEND pour accéder directement à Facebook ou Twitter plutôt que d'afficher la boîte de dialogue. Si tel était le cas, je pourrais créer ma propre boîte de dialogue et quand ils cliquent sur "Facebook", créer une intention spécifique à Facebook et les envoyer simplement à Facebook. Même chose avec Twitter.

OU n'est-ce pas possible? Les API Facebook et Twitter sont-elles le seul moyen?


Double possible: [filtrage-personnalisé-d'intention-chooser-based-on-installed-android-package-name] [1] [1]: stackoverflow.com/questions/5734678/…
Asaf Pinhassi

1
Ce billet de blog semble être la réponse parfaite: hkdevtips.blogspot.com/2013/02/…
Vitali Olshevski

2
bon ami ... quand je clique sur mon bouton d'envoi, ouvrez la boîte de dialogue de partage et la liste de dialogue de partage est "gmail, email, zapiya, raccordement" etc. mais ne pas montrer facebook, whatsapp, messanger facebook, faire des randonnées ... comment puis-je montrer son ??
GB_Bhayani ツ

comment ne pas afficher le sélecteur lorsqu'il n'y a qu'un seul élément / option d'action d'intention sur Android 6.0? le problème ne s'affiche pas sous Android 6.0
zys

Réponses:


324

À ma connaissance, StackOverflow a beaucoup de gens qui posent cette question de différentes manières, mais personne n'y a encore répondu complètement.

Ma spécification demandait à l'utilisateur de pouvoir choisir l'email, Twitter, Facebook ou SMS, avec un texte personnalisé pour chacun. Voici comment j'ai accompli cela:

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);       
}

J'ai trouvé des bouts de comment faire ceci dans divers endroits, mais je n'ai pas vu tout cela dans un endroit nulle part ailleurs.

Notez que cette méthode masque également toutes les options idiotes que je ne veux pas, comme le partage via wifi et bluetooth.

J'espère que cela aide quelqu'un.

Edit: Dans un commentaire, on m'a demandé d'expliquer ce que fait ce code. Fondamentalement, il crée ACTION_SENDUNIQUEMENT une intention pour le client de messagerie natif, puis ajoute d'autres intentions au sélecteur. Rendre l'intention d'origine spécifique à l'e-mail élimine tous les indésirables supplémentaires tels que le wifi et le bluetooth, puis je saisis les autres intentions que je veux d'un générique ACTION_SENDde type texte brut et les cloue avant d'afficher le sélecteur.

Lorsque je saisis les intentions supplémentaires, je définis un texte personnalisé pour chacune.

Edit2: Cela fait un moment que j'ai posté ceci, et les choses ont un peu changé. Si vous voyez gmail deux fois dans la liste des options, essayez de supprimer la gestion spéciale pour "android.gm" comme suggéré dans un commentaire de @h_k ci-dessous.

Étant donné que cette seule réponse est la source de presque tous mes points de réputation de stackoverflow, je dois au moins essayer de la maintenir à jour.


1
J'utilise ce code, mais d'une manière ou d'une autre, evernote se faufile dans la liste. Lorsque je vérifie les noms des packages, c'est com.evernote, donc je ne sais pas pourquoi cela se produit.
James Harpe

1
@ user2249287 Je vous suggère de parcourir le code jusqu'à ce que vous voyiez l'application de messagerie qui est ignorée, puis de regarder le nom du paquet pour déterminer quelle chaîne vous devez ajouter à la liste blanche pour que cette application apparaisse.
dacoinminster le

1
@Gilbou Salut! Désolé - cela fait longtemps que je n'ai pas regardé ce code. . . Si je me souviens bien, la commande setPackage choisit l'intention unique à laquelle vous ajouterez tout le reste. Pour inclure ou exclure diverses autres intentions, je vous recommande de parcourir le code et de regarder les noms des packages.
dacoinminster le

2
Pour filtrer UNIQUEMENT les applications de messagerie de l'utilisateur, vous pouvez utiliser la deuxième réponse à cette question: stackoverflow.com/questions/8701634/send-email-intent . Il ne nécessite pas d'utiliser un type de données de message / rfc822 que d'autres applications, telles que EverNote dans ce cas, utilisent également.
mpellegr

2
@dacoinminster votre code a été génial pour me permettre de définir un texte différent pour des applications comme Twitter et Whatsapp. Pour supprimer le gmail en double, j'ai simplement retiré "android.gm" de l'équation. Je reçois toujours gmail et l'application de messagerie intégrée dans la liste de sélection et le sujet et le texte sont toujours intacts.
h_k

26

Si vous souhaitez une option personnalisée, vous ne devez pas vous fier à la boîte de dialogue par défaut fournie par Android pour cette action.

Ce que vous devez faire à la place, c'est déployer le vôtre. Vous devrez interroger le PackageManager sur les packages qui gèrent l'action dont vous avez besoin, puis en fonction de la réponse, vous appliquez le filtrage et le texte personnalisé.

Plus précisément, jetez un oeil à la méthode queryIntentActivities de la PackageManager classe. Vous créez l'intention qui lancerait la boîte de dialogue par défaut (l'intention ACTION_SEND), transmettez-la à cette méthode et vous recevrez une liste d'objets contenant des informations sur les activités pouvant gérer cette intention. En utilisant cela, vous pouvez choisir ceux que vous voulez.

Une fois que vous avez créé votre liste de packages que vous souhaitez présenter, vous devez créer votre propre boîte de dialogue de liste (de préférence une activité avec le thème de la boîte de dialogue) qui affichera cette liste.

Une chose à noter cependant est qu'il est très difficile de faire en sorte que cette boîte de dialogue personnalisée ressemble à celle par défaut. Le problème est que le thème utilisé dans cette boîte de dialogue est un thème interne et ne peut pas être utilisé par votre application. Vous pouvez soit essayer de le rendre aussi similaire à celui natif que vous le souhaitez ou opter pour un look complètement personnalisé (de nombreuses applications le font comme l'application de galerie, etc.)


1
Marquer cette réponse comme correcte car elle répond le plus étroitement à la question initiale, même si j'ai fini par emprunter un chemin différent (voir ma réponse). Merci.
Kyle Clegg

22

Essayez celui-ci pour ne partager que trois applications: 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);
        }
    }
}

ce code fonctionne parfaitement si vous essayez de partager avec des applications spécifiques
Orcun Sevsay

22

J'ai trouvé une solution qui fonctionne pour moi en regardant ici (voir le troisième commentaire sur la première réponse). Ce code recherche un client Twitter valide et l'utilise pour publier le tweet. Remarque: il ne vous donne pas d'intention avec les différents clients Twitter et vous permet de choisir.

Partagez sur Twitter:

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

Appel de cette méthode:

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 sera similaire en utilisant " com.facebook.katana ", bien que vous ne puissiez toujours pas définir le texte du message (obsolète en juillet 2011).

Source du code: intention d'ouvrir le client Twitter sur Android


4
Je n'aime pas cette réponse car elle repose sur la connaissance des noms de package de toutes les applications Twitter. Pour une autre façon, voir stackoverflow.com/questions/6827407/…
Ed Burnette

Je suis d'accord avec vous, même si la réponse à laquelle vous avez fait référence pose un problème similaire. Je n'aime jamais me fier aux comparaisons de chaînes, surtout lorsque je n'ai aucun contrôle ou que je ne garantis pas que la chaîne ne changera pas.
Kyle Clegg

11

Merci à @dacoinminster. J'apporte quelques modifications à sa réponse, y compris les noms de package des applications populaires et le tri de ces applications.

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

Vous pouvez essayer le code ci-dessous, cela fonctionne parfaitement.

Ici, nous partageons certaines applications spécifiques, à savoir Facebook, Messenger, Twitter, Google Plus et 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);
        }
    }

quelle est la raison de "if (name.contains (" com.twitter.android.DMActivity ")) {continue;}?
isJulian00

8

Cette solution affiche une liste d'applications dans une boîte de dialogue ListView qui ressemble au sélecteur:

capture d'écran

C'est à vous de:

  1. obtenir la liste des packages d'application pertinents
  2. étant donné un nom de package, invoquez l'intention appropriée

La classe d'adaptateur:

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;
    }

}

et son utilisation:

    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

Le moyen le plus simple consiste à copier les classes suivantes: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Ajoutez la possibilité de filtrer les intentions dans ActivityChooserModel et les méthodes de support appropriées dans ShareActionProvider. J'ai créé les classes nécessaires, vous pouvez les copier dans votre projet ( https://gist.github.com/saulpower/10557956 ). Cela ajoute non seulement la possibilité de filtrer les applications avec lesquelles vous souhaitez partager (si vous connaissez le nom du package), mais également de désactiver l'historique.

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);
}

comment ajouter google + et d'autres options contenant des applications
restantes

3

J'ai amélioré la réponse @dacoinminster et voici le résultat avec un exemple pour partager votre application:

// 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

J'ai eu le même problème et cette solution acceptée ne m'a pas aidé, si quelqu'un a le même problème, vous pouvez utiliser mon extrait de code:

// 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

Si simple et concis. Merci au développeur Open source, cketti pour le partage de cette solution:

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
}

Et c'est le lien vers son / son essentiel.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.