如何在共享菜单中排除您自己的应用程序?

21
该应用程序具有意图过滤器,可通过ACTION_SEND意图在其他应用程序的共享菜单中显示。 应用程序本身也使用ACTION_SEND和createChooser()具有共享菜单,并且我的应用程序出现在列表中。 由于它们已经在我的应用程序中,因此似乎奇怪它们能够分享回自己。
如果从我的应用程序中调用该应用程序,是否有一种方法可以使其不出现在列表中?

1
https://developer.android.com/training/sharing/send#excluding-specific-targets-by-component - rmtheis
4个回答

22

以下是你的解决方案。如果你想排除自己的应用程序,你可以使用ctx.getPackageName()替换“packageNameToExclude”。

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;
}

1
这对我有效...只是我有一个关于targetedShareIntents.remove(0)的问题...你为什么要那样做? - Maher Abuthraa
2
因为您需要向Chooser创建方法提供一个意图,然后将其余的意图作为额外内容添加。 - Addev
无法工作。它显示出奇怪的共享目标,并且列表中没有出现几个应用程序。 - Aron Lorincz
感谢您的启发。 - Vit Khudenko

9

如果我的应用程序从自己的应用程序中调用,有没有办法使其不出现在列表中?

不能通过createChooser()实现。但是,您可以通过PackageManagerqueryIntentActivities()创建自己的类似于chooser的对话框,并通过筛选自己来达到目的。


有没有内置的东西可以将我筛选过的List<ResolveInfo>输入进去,以创建共享对话框,还是我必须使用列表创建自己的对话框?如果是后者,如何在对话框中显示应用程序图标?谢谢。 - cottonBallPaws
1
@littleFluffyKitty:你可以使用自己的对话框(例如,AlertDialog.BuildersetAdapter())。PackageManager 可以提供图标。请参见 http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/。 - CommonsWare
谢谢,这真的很有帮助。你有什么建议是从queryIntentActivities()返回的列表与我的应用程序进行比较/过滤的最佳方法吗?我想使用包名称,但是否有更好的比较方法? - cottonBallPaws
2
@littleFluffyKitty:包名几乎可以确定是你最好的选择。 - CommonsWare

1
你应该使用


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

1

已在此处回答 - https://dev59.com/NVoT5IYBdhLWcg3wngu1#74131607

将targetSdkVersion更新为31后,旧解决方案将停止工作。下面的解决方案适用于所有Android版本。

在Manifest文件AndroidManidest.xml中

(在Android api 31中,默认情况下queryIntentActivities()将返回空列表,为了从queryIntentActivities获取所需的结果,您需要在清单文件中添加以下查询参数。)

<manifest>
   <queries>
      <intent>
         <!--Change the action and data depending on you share intent-->
         <action android:name="android.intent.action.SEND" /> 
         <data android:mimeType="text/*"/>

      </intent>
   </queries>
</manifest>

在活动文件分享功能中

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");

shareIntent.putExtra(Intent.EXTRA_TEXT, "Link");
shareIntent.putExtra(Intent.EXTRA_SUBJECT,"Description")

ArrayList<ComponentName> excludedComponents = new ArrayList<ComponentName>();
PackageManager packageManager = context.getPackageManager();
for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(shareIntent, 0)){
String packageName = resolveInfo.activityInfo.packageName;
//change facebook with whichever app you want to exclude or you can directly search for the specific package name
   if (packageName.contains("facebook")){
   excludedComponents.add(new 
   ComponentName(packageName,resolveInfo.activityInfo.name));
   }
}

Intent intentChooser = Intent.createChooser(shareIntent, "Share");
intentChooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponents.toArray(new Parcelable[]{}));
startActivity(intentChooser);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接