2010-10-31 36 views
19

L'application dispose d'un filtre d'intention lui permettant d'apparaître dans le menu de partage dans d'autres applications via les intentions ACTION_SEND. L'application elle-même dispose également d'un menu de partage utilisant ACTION_SEND et createChooser(), et mon application apparaît dans la liste. Comme ils sont déjà dans mon application, il semble étrange de pouvoir les partager avec eux-mêmes.Comment exclure votre propre application du menu Partage?

Existe-t-il un moyen pour que mon application n'apparaisse pas dans la liste si elle est appelée depuis mon application?

Répondre

8

Est-il possible que mon application ne s'affiche pas dans la liste si elle est appelée depuis mon application?

Non via createChooser(). Vous pouvez créer votre propre boîte de dialogue de type sélecteur via PackageManager et queryIntentActivities() et vous filtrer de cette façon, cependant.

+0

Ce qu'il ya quelque chose construit que je peux nourrir ma liste filtrée retour dans, pour créer la boîte de dialogue de partage, ou dois-je créer ma propre boîte de dialogue en utilisant la liste? Si c'est la dernière, comment les icônes de l'application apparaissent-elles dans une boîte de dialogue? Merci. – cottonBallPaws

+1

@littleFluffyKitty: Vous utiliseriez votre propre boîte de dialogue (par exemple, 'AlertDialog.Builder' et' setAdapter() '). 'PackageManager' peut vous donner les icônes. Voir http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/ – CommonsWare

+0

merci c'est vraiment utile. Avez-vous des suggestions qui constituent le meilleur moyen de comparer/filtrer la liste renvoyée par queryIntentActivities() avec mon application? Je pensais utiliser le nom du paquet, mais y a-t-il une meilleure comparaison? – cottonBallPaws

19

Voici votre solution. Si vous voulez exclure votre propre application, vous pouvez changer « packageNameToExclude » avec ctx.getPackageName()

public static Intent shareExludingApp(Context ctx, String packageNameToExclude, String imagePath, String text) { 
    List<Intent> targetedShareIntents = new ArrayList<Intent>(); 
    Intent share = new Intent(android.content.Intent.ACTION_SEND); 
    share.setType("image/*"); 
    List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(text,new File(imagePath)), 0); 
    if (!resInfo.isEmpty()) { 
     for (ResolveInfo info : resInfo) { 
      Intent targetedShare = createShareIntent(text,new File(imagePath)); 

      if (!info.activityInfo.packageName.equalsIgnoreCase(packageNameToExclude)) { 
       targetedShare.setPackage(info.activityInfo.packageName); 
       targetedShareIntents.add(targetedShare); 
      } 
     } 

     Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), 
       "Select app to share"); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
       targetedShareIntents.toArray(new Parcelable[] {})); 
     return chooserIntent; 
    } 
    return null; 
} 

private static Intent createShareIntent(String text, File file) { 
    Intent share = new Intent(android.content.Intent.ACTION_SEND); 
    share.setType("image/*"); 
    if (text != null) { 
     share.putExtra(Intent.EXTRA_TEXT, text); 
    } 
    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); 
    return share; 
} 
+0

Cela fonctionne pour moi .. juste j'ai une question à propos de ceShareShare.temove (0) ... pourquoi avez-vous fait cela? –

+1

Parce que vous devez donner une intention à la méthode du créateur Chooser, puis ajouter le reste des intentions en tant que supplément – Addev

+0

Ne fonctionne pas. Il montre des cibles de partage étranges et plusieurs applications n'apparaissent pas dans la liste. –

1

Vous devez utiliser

Intent chooserIntent = Intent.createChooser(new Intent(), "Select app to share");