2012-03-16 12 views
151

Come si può filtrare applicazioni 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 in base alle risposte fornite. Spero che qualcuno possa aiutare. Vorrei fornire la possibilità di condividere all'interno di un'app. Seguendo Android Dev Alexander Lucas' advice, preferirei farlo usando intents e non usando le API di Facebook/Twitter.come filtrare le applicazioni specifiche per l'intento ACTION_SEND (e impostare un testo diverso per ogni app)

Sharing using ACTION_SEND intent

condivisione con l'intento ACTION_SEND è grande, ma il problema è (1) io non voglio ogni opzione condivisione di lì, preferirei limitarla a FB, Twitter, e-mail, e (2) Non voglio condividere la stessa cosa con ogni app di condivisione. Ad esempio, nella mia condivisione su Twitter includerò alcune citazioni e hashtag limitati a 140 caratteri o meno, mentre la condivisione di Facebook includerà un collegamento e un'immagine di una funzione.

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

O

Invece di filtrare le applicazioni di condivisione, il mio problema potrebbe anche essere risolto se potevo usare l'intento ACTION_SEND per andare direttamente a Facebook o Twitter, piuttosto che spuntando la finestra di dialogo. Se così fosse, potrei creare la mia finestra di dialogo e quando faranno clic su "Facebook" creerò un intento specifico di Facebook e semplicemente li manderemo su Facebook. Lo stesso con Twitter.

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

+0

Eventuali duplicati: [custom-filtering-of-intent-chooser-based-on-installato-android-package-name] [1] [1]: http: // StackOverflow .com/questions/5734678/custom-filtering-of-intent-chooser-based-on-installed-android-nome-pacchetto –

+1

Questo blogpost sembra essere la risposta perfetta: http://hkdevtips.blogspot.com/2013/ 02/customize-your-actionchooser-intent.html –

+2

ehi amico ...quando clicco sul pulsante di invio, apro la finestra di dialogo di condivisione e l'elenco di dialoghi condivisi è "gmail, email, zapiya, collegamento" ecc. ma non mostra facebook, whatsapp, facebook messanger, luoghi di ritrovo ... come posso mostrare il suo ?? –

risposta

280

A mia conoscenza, StackOverflow ha molte persone che fanno questa domanda in vari modi, ma nessuno ha ancora risposto completamente.

La mia specifica richiedeva che l'utente potesse scegliere email, twitter, facebook o SMS, con testo personalizzato per ognuno. Ecco come ho compiuto che:

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 fare questo in vari luoghi, ma non ho visto tutto questo in un unico luogo altrove.

Si noti che questo metodo nasconde anche tutte le opzioni stupide che non desidero, come la condivisione su 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 un intento ACTION_SEND per il client di posta nativa SOLO, quindi aggiungendo altri intenti al selettore. Rendere l'intento originale specifico per l'e-mail elimina tutte le cianfrusaglie extra come il wifi e il bluetooth, quindi afferro gli altri intenti che voglio da un generico ACTION_SEND di tipo plaintext e li applico prima di mostrare il selettore.

Quando seleziono gli intenti aggiuntivi, imposto il testo personalizzato per ognuno.

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

Dal momento che questo risposta è la fonte di quasi tutti i miei punti StackOverflow reputazione, devo almeno provare a tenerlo aggiornato :)

+1

Sto usando questo codice, ma in qualche modo evernote si sta intrufolando nella lista. Quando controllo i nomi dei pacchetti, è com.evernote, quindi non sono sicuro del motivo per cui ciò sta accadendo. –

+0

@JamesHarpe Scommetto che Evernote supporta il tipo di intento "message/rfc822", quindi viene visualizzato nell'elenco da cui abbiamo iniziato. Se c'è un modo subdolo per personalizzare ulteriormente questo per escludere Evernote, sarei interessato a sentirlo! – dacoinminster

+0

@dacoinminster Ciao, ho aggiunto questo codice che mostra l'app di gmail e facebook per scegliere ma non l'app di messaggistica nel mio telefono HD di tela micromax. Puoi aiutarmi cosa posso cambiare qui? – kumar

25

Se si desidera una soluzione su misura, allora non si dovrebbe fare affidamento sul dialogo predefinito fornito da Android per questa azione.

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

In particolare, dare un'occhiata al metodo queryIntentActivities della classe PackageManager. Costruisci l'intento che avvierebbe la finestra di dialogo predefinita (l'intento ACTION_SEND), passa questo a questo metodo e riceverai un elenco di oggetti che contengono informazioni sulle attività che possono gestire tale intento. Usando questo, puoi scegliere quelli che vuoi.

Una volta a costruire la vostra lista di pacchetti che si desidera presentare, è necessario costruire il proprio dialogo lista (di preferenza un'attività con il tema di dialogo) che visualizzerà tale elenco.

Una cosa da notare però è che è molto difficile fare quel dialogo personalizzato sguardo come quello di default. 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 il più simile a quello nativo come si desidera o andare per un look completamente personalizzato (molte applicazioni fanno che, come la galleria app ecc)

+1

Contrassegnare correttamente questa risposta poiché risponde più strettamente alla domanda originale, anche se ho finito per seguire un percorso diverso (vedi la mia risposta). Grazie. –

+0

Qualche esempio di codice per questo? – Jasper

21

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

Condividi tramite Twitter:

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

chiamata a 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 con "com.facebook.katana", anche se non è ancora possibile impostare il testo del messaggio (deprecato luglio 2011).
Codice sorgente: http://regis.decamps.info/blog/2011/06/intent-to-open-twitter-client-on-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 http://stackoverflow.com/questions/6827407/how-to-customize-share-intent-in-android/9229654 –

+0

Sono d'accordo con te, sebbene la risposta a cui hai collegato abbia un problema simile. Non mi piace mai fare affidamento sui confronti tra stringhe, soprattutto quando non ho controllo o garantisco che la stringa non cambierà. –

7

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

screenshot

spetta a voi per:

  1. ottenere l'elenco dei pacchetti applicativi rilevanti
  2. dato un nome del pacchetto, invocare l'intento rilevanti

La classe 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); 
    } 
19

provare questo uno per la condivisione di solo tre apps-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); 
     } 
    } 
} 
+0

questo codice funziona perfettamente se si sta tentando di condividere con app specifiche – MiloRambaldi

3

Il modo più pulito è quello di copiare le seguenti classi: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Aggiungi la possibilità di filtrare gli intent 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). Questo non solo aggiunge la possibilità di filtrare le app con le quali vorresti 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); 
} 
+0

come aggiungere google + e altre opzioni che contengono applicazioni rimanenti –

1

Ho migliorato @dacoinminster risposta e questo è il risultato con un esempio per condividere la vostra applicazione:

// 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()]))); 
1
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
    Uri.fromParts("mailto", "[email protected]", null)); 
emailIntent.putExtra(Intent.EXTRA_SUBJECT, text); 
startActivity(Intent.createChooser(emailIntent, "Send email...")); 
1

Ho avuto lo stesso problema e questa soluzione accettata non mi hanno aiutato, se qualcuno ha lo stesso problema è possibile utilizzare my 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); 

} 
5

si può provare il codice sotto, funziona perfettamente.

Qui condividiamo con alcune app specifiche, 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); 
     } 
    } 
2

Grazie a @dacoinminster. Apporto alcune modifiche alla sua risposta, compresi 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(); 
    } 
} 
Problemi correlati