Come filtrare app specifiche per ACTION_SEND intento (e impostare un testo diverso per ogni app)


187

Come filtrare app specifiche quando si utilizza l'intento ACTION_SEND? Questa domanda è stata posta in vari modi, ma non sono stato in grado di raccogliere una soluzione basata sulle risposte fornite. Spero che qualcuno possa aiutare. Vorrei fornire la possibilità di condividere all'interno di un'app. Seguendo i consigli di Android Dev Alexander Lucas , preferirei farlo usando gli intenti e non le API di Facebook / Twitter.

Condivisione con intento ACTION_SEND

La condivisione con l'intento ACTION_SEND è eccezionale, ma il problema è (1) non voglio tutte le opzioni di condivisione lì, piuttosto limiterei a FB, Twitter ed e-mail e (2) non voglio condividere la stessa cosa per ogni app di condivisione . Ad esempio, nella mia condivisione di Twitter includerò alcune menzioni e hashtag lo limitano a 140 caratteri o meno, mentre la condivisione di Facebook includerà un collegamento e un'immagine di funzionalità.

È possibile limitare le opzioni per l'intento ACTION_SEND (condivisione)? Ho visto qualcosa sull'uso di PackageManager e queryIntentActivities, ma non sono stato in grado di capire la connessione tra PackageManager e l'intento ACTION_SEND.

O

Invece di filtrare le app di condivisione, il mio problema potrebbe anche essere risolto se potessi usare l'intento ACTION_SEND per andare direttamente su Facebook o Twitter anziché aprire la finestra di dialogo. Se così fosse, allora potrei creare la mia finestra di dialogo e quando fanno clic su "Facebook" creano un intento specifico di Facebook e li inviano fino a Facebook. Lo stesso con Twitter.

O non è possibile? Le API di Facebook e Twitter sono l'unico modo?


Eventuali duplicati: [custom-filtraggio-of-intent-chooser-based-on-installato-android-package-name] [1] [1]: stackoverflow.com/questions/5734678/...
Asaf Pinhassi

1
Questo post sul blog sembra essere la risposta perfetta: hkdevtips.blogspot.com/2013/02/…
Vitali Olshevski,

2
hey amico ... quando faccio clic sul pulsante di invio, apro la finestra di dialogo Condividi e condividi l'elenco delle finestre di dialogo è "gmail, e-mail, zapiya, collegamento" ecc. ma non mostrando facebook, whatsapp, facebook messanger, hout hangouts ... come posso mostrarlo ??
GB_Bhayani ツ

come non mostrare il selettore quando c'è solo un oggetto / opzione di azione intenzionale su Android 6.0? il problema non si manifesta su Android 6.0
zys

Risposte:


324

Per quanto ne so, StackOverflow ha molte persone che fanno questa domanda in vari modi, ma nessuno ha ancora risposto completamente.

Le mie specifiche prevedevano che l'utente potesse scegliere e-mail, twitter, facebook o SMS, con un testo personalizzato per ognuno. Ecco come l'ho realizzato:

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

Ho trovato pezzi di come farlo in vari posti, ma non ho visto tutto in un posto altrove.

Nota che questo metodo nasconde anche tutte le opzioni sciocche che non voglio, come la condivisione tramite wifi e bluetooth.

Spero che questo aiuti qualcuno.

Modifica: in un commento, mi è stato chiesto di spiegare cosa sta facendo questo codice. Fondamentalmente, sta creando ACTION_SENDSOLO un intento per il client di posta elettronica nativo, quindi affrontando altri intenti sul selettore. Rendere l'intento originale specifico per e-mail elimina tutta la spazzatura extra come il wifi e il bluetooth, quindi afferro gli altri intenti che desidero da un generico ACTION_SENDdi tipo testo normale e li applico prima di mostrare il selettore.

Quando afferro gli intenti aggiuntivi, imposto un testo personalizzato per ognuno.

Edit2: È passato un po 'di tempo da quando l'ho pubblicato e le cose sono cambiate un po'. Se vedi due volte Gmail nell'elenco delle opzioni, prova a rimuovere la gestione speciale per "android.gm" come suggerito in un commento di @h_k di seguito.

Dato che questa risposta è la fonte di quasi tutti i miei punti reputazione di StackOverflow, devo almeno provare a tenerlo aggiornato.


1
Sto usando questo codice, ma in qualche modo evernote si sta intrufolando nell'elenco. Quando controllo i nomi dei pacchetti, è com.evernote, quindi non sono sicuro del perché accada.
James Harpe,

1
@ user2249287 Ti suggerirei di scorrere il codice fino a quando non vedi l'app di messaggistica che viene ignorata, quindi dai un'occhiata al nomepacchetto per determinare quale stringa devi aggiungere alla whitelist per essere visualizzata.
Dacoinminster,

1
@Gilbou Hi! Siamo spiacenti, è da molto tempo che non guardo questo codice. . . Come ricordo, il comando setPackage sceglie il singolo intento a cui aggiungere tutto il resto. Per includere o escludere vari altri intenti, ti consiglio di consultare il codice e guardare i nomi dei pacchetti.
Dacoinminster,

2
Per filtrare SOLO le app di posta elettronica dell'utente, puoi utilizzare la seconda risposta da questa domanda: stackoverflow.com/questions/8701634/send-email-intent . Non richiede l'utilizzo di un tipo di dati di message / rfc822 che usano anche altre app, come EverNote in questo caso.
mpellegr,

2
@dacoinminster il tuo codice è stato fantastico per avermi permesso di definire testi diversi per app come Twitter e Whatsapp. Per rimuovere il duplicato di Gmail, ho appena eliminato "android.gm" dall'equazione. Ricevo ancora Gmail e l'app di posta integrata nell'elenco dei selettori e l'oggetto e il testo sono ancora intatti.
h_k,

26

Se desideri un'opzione personalizzata, non dovresti fare affidamento sulla finestra di dialogo predefinita fornita da Android per questa azione.

Quello che devi fare invece è stendere il tuo. Dovrai interrogare il PackageManager su quali pacchetti gestiscono l'azione richiesta e quindi in base alla risposta, applichi il filtro e il testo personalizzato.

In particolare, dare un'occhiata al il metodo queryIntentActivities della PackageManager di classe. Si crea l'intento che avvierebbe la finestra di dialogo predefinita (l'intento ACTION_SEND), lo si passa a questo metodo e si riceverà un elenco di oggetti che contengono informazioni sulle attività in grado di gestirlo. Usandolo, puoi scegliere quelli che desideri.

Una volta creato l'elenco dei pacchetti che si desidera presentare, è necessario creare la propria finestra di dialogo dell'elenco (preferibilmente un'attività con il tema della finestra di dialogo) che visualizzerà tale elenco.

Una cosa da notare è che è molto difficile rendere quella finestra di dialogo personalizzata simile a quella predefinita. Il problema è che il tema utilizzato in quella finestra di dialogo è un tema interno e non può essere utilizzato dall'applicazione. Puoi provare a renderlo simile a quello nativo come desideri o cercare un look completamente personalizzato (molte app lo fanno come l'app della galleria, ecc.)


1
Contrassegnare questa risposta come corretta poiché risponde più da vicino alla domanda originale, anche se ho finito per seguire una strada diversa (vedi la mia risposta). Grazie.
Kyle Clegg,

22

Prova questo per condividere solo tre app: 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);
        }
    }
}

questo codice funziona perfettamente se stai cercando di condividere con app specifiche
Orcun Sevsay

22

Ho trovato una soluzione che funziona per me guardando qui (vedi il terzo commento sulla prima risposta). Questo codice cerca un client twitter valido e lo utilizza per pubblicare il tweet. Nota: non ti dà un intento con i vari client Twitter e ti consente di scegliere.

Condividi utilizzando Twitter:

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

Chiamando questo metodo:

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 sarà simile usando " com.facebook.katana ", anche se non è ancora possibile impostare il testo del messaggio (obsoleto luglio 2011).

Fonte del codice: intento di aprire il client Twitter su Android


4
Non mi piace questa risposta perché si basa sulla conoscenza dei nomi dei pacchetti di tutte le app di Twitter. Per un altro modo vedi stackoverflow.com/questions/6827407/…
Ed Burnette,

Sono d'accordo con te, sebbene la risposta a cui ti sei collegato abbia un problema simile. Non mi piace fare affidamento sul confronto delle stringhe, specialmente quando non ho alcun controllo o garantisco che la stringa non cambierà.
Kyle Clegg,

11

Grazie a @dacoinminster. Apporto alcune modifiche alla sua risposta, inclusi i nomi dei pacchetti delle app popolari e l'ordinamento di quelle app.

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

Puoi provare il codice qui sotto, funziona perfettamente.

Qui condividiamo alcune app specifiche, che sono Facebook, Messenger, Twitter, Google Plus e 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);
        }
    }

qual è il motivo di "if (name.contains (" com.twitter.android.DMActivity ")) {continue;}?
isJulian00

8

Questa soluzione mostra un elenco di applicazioni in una finestra di dialogo ListView che ricorda il selettore:

immagine dello schermo

Sta a te:

  1. ottenere l'elenco dei pacchetti applicativi pertinenti
  2. dato un nome di pacchetto, invoca l'intento pertinente

La classe dell'adattatore:

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

}

e il suo utilizzo:

    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

Il modo più pulito è copiare le seguenti classi: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Aggiungi la possibilità di filtrare gli intenti in ActivityChooserModel e i metodi di supporto appropriati in ShareActionProvider. Ho creato le classi necessarie, puoi copiarle nel tuo progetto ( https://gist.github.com/saulpower/10557956 ). Ciò non solo aggiunge la possibilità di filtrare le app con cui desideri condividere (se conosci il nome del pacchetto), ma anche di disattivare la cronologia.

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

come aggiungere google + e altre opzioni che contengono applicazioni
rimanenti

3

Ho migliorato la risposta di @dacoinminster e questo è il risultato con un esempio per condividere la tua app:

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

Ho avuto lo stesso problema e questa soluzione accettata non mi ha aiutato, se qualcuno ha lo stesso problema puoi usare il mio frammento di codice:

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

Così semplice e conciso. Grazie allo sviluppatore Open source, cketti per aver condiviso questa soluzione:

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
}

E questo è il link al suo contenuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.