2010-10-31 55 views
19

該應用程序有一個意圖過濾器,允許它通過ACTION_SEND意圖出現在其他應用程序的共享菜單中。應用程序本身也有一個使用ACTION_SEND和createChooser()的共享菜單,我的應用程序出現在列表中。由於他們已經在我的應用程序中,讓他們能夠分享回自己似乎很奇怪。如何從共享菜單中排除您自己的應用程序?

如果從應用程序調用應用程序,我的應用程序是否不會出現在列表中?

回答

8

如果從應用程序調用應用程序時,我的應用程序是否出現在列表中?

不通過createChooser()。不過,您可以通過PackageManagerqueryIntentActivities()創建自己的類似選擇器的對話框,然後將自己過濾出來。

+0

這有什麼內置的,我可以養活我的過濾列表回進入,創建共享對話框,還是必須使用列表創建自己的對話框?如果是後者,你如何讓應用程序的圖標出現在對話框中?謝謝。 – cottonBallPaws 2010-10-31 21:30:09

+1

@littleFluffyKitty:你會使用你自己的對話框(例如'AlertDialog.Builder'和'setAdapter()')。 'PackageManager'可以給你圖標。見http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/ – CommonsWare 2010-11-01 07:04:04

+0

謝謝,這真的很有幫助。你有什麼建議,這是比較/過濾從我的應用程序queryIntentActivities()返回的列表的最佳方式?我正在考慮使用軟件包名稱,但有沒有更好的比較? – cottonBallPaws 2010-11-01 20:37:18

19

這裏有你的解決方案。如果你想排除自己的應用程序,你可以改變「packageNameToExclude」與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

這是爲我工作..只是我有一個關於這個targetedShareIntents.remove(0)的問題......你爲什麼這樣做? – 2014-10-20 22:32:02

+1

因爲您需要給Chooser創建者方法一個意圖,然後將其餘意圖添加爲額外的 – Addev 2014-10-23 07:53:41

+0

不起作用。它顯示出奇怪的共享目標,並且多個應用程序不會出現在列表中。 – 2014-11-16 14:17:22

1

您應該使用

Intent chooserIntent = Intent.createChooser(new Intent(), "Select app to share"); 
相關問題