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