2010-10-31 6 views
19

Die App verfügt über einen Intent-Filter, damit sie über ACTION_SEND Intents im Freigabe-Menü in anderen Anwendungen angezeigt werden kann. Die App selbst hat auch ein Freigabe-Menü mit ACTION_SEND und createChooser(), und meine App erscheint in der Liste. Da sie bereits in meiner App sind, scheint es seltsam, sie in der Lage zu haben, sich selbst zu teilen.Wie Sie Ihre eigene App aus dem Menü "Teilen" ausschließen?

Gibt es eine Möglichkeit, dass meine App nicht in der Liste angezeigt wird, wenn sie von meiner App aus aufgerufen wird?

Antwort

8

Gibt es eine Möglichkeit, dass meine App nicht in der Liste angezeigt wird, wenn sie von meiner App aus aufgerufen wird?

Nicht über createChooser(). Über PackageManager und queryIntentActivities() können Sie einen eigenen Dialog erstellen und sich so filtern.

+0

Dieses etwas, dass baute ich meine gefiltert zurück zuführen kann in, um den Freigabedialog zu erstellen, oder muss ich über die Liste einen eigenen Dialog erstellen? Wenn es das Letztere ist, wie erhalten Sie die Symbole der App, um in einem Dialog zu erscheinen? Vielen Dank. – cottonBallPaws

+1

@littleFluffyKitty: Sie würden Ihren eigenen Dialog verwenden (z. B. 'AlertDialog.Builder' und' setAdapter() '). 'PackageManager' kann Ihnen die Symbole geben. Siehe http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/ – CommonsWare

+0

danke das ist wirklich hilfreich. Haben Sie Vorschläge, welche die beste Möglichkeit ist, die von queryIntentActivities() zurückgegebene Liste mit meiner App zu vergleichen/filtern? Ich dachte daran, den Paketnamen zu verwenden, aber gibt es einen besseren Vergleich? – cottonBallPaws

19

Hier geht Ihre Lösung. Wenn Sie Ihre eigene App ausschließen möchten, können Sie „packageNameToExclude“ mit ctx.getPackageName ändern()

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

Das funktioniert für mich .. nur ich habe eine Frage zu diesem targetedShareIntents.remove (0) ... warum hast du das getan? –

+1

Weil Sie der Erstellungsmethode für den Ersteller eine Absicht geben müssen und dann den Rest der Absichten als Extra hinzufügen müssen – Addev

+0

Funktioniert nicht. Es zeigt seltsame Freigabeziele an und mehrere Apps erscheinen nicht in der Liste. –

1

sollten Sie verwenden

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