Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从共享菜单中排除您自己的应用程序?_Android_Menu_Android Intent_Share - Fatal编程技术网

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

Android 如何从共享菜单中排除您自己的应用程序?,android,menu,android-intent,share,Android,Menu,Android Intent,Share,该应用程序有一个意向过滤器,允许它通过“发送意向”操作显示在其他应用程序的“共享”菜单中。应用程序本身也有一个使用ACTION_SEND和createChooser的共享菜单,我的应用程序出现在列表中。因为它们已经出现在我的应用程序中,所以让它们自己分享似乎很奇怪 如果从我的应用程序调用我的应用程序,是否有方法使其不出现在列表中 如果从我的应用程序调用我的应用程序,是否有方法使其不出现在列表中 不是通过createChooser。不过,您可以通过PackageManager和QueryInput

该应用程序有一个意向过滤器,允许它通过“发送意向”操作显示在其他应用程序的“共享”菜单中。应用程序本身也有一个使用ACTION_SEND和createChooser的共享菜单,我的应用程序出现在列表中。因为它们已经出现在我的应用程序中,所以让它们自己分享似乎很奇怪

如果从我的应用程序调用我的应用程序,是否有方法使其不出现在列表中

如果从我的应用程序调用我的应用程序,是否有方法使其不出现在列表中


不是通过createChooser。不过,您可以通过PackageManager和QueryInputActivities创建自己的类似选择器的对话框,并通过这种方式筛选自己。

您的解决方案来了。如果您想排除自己的应用程序,可以使用ctx.getPackageName更改packagenamotoexclude

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;
}
你应该使用

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

这是内置的东西,我可以将过滤后的列表反馈回其中,以创建共享对话框,还是必须使用列表创建自己的对话框?如果是后者,你如何让应用程序的图标出现在对话框中?谢谢。@Littleflufykitty:您可以使用自己的对话框,例如AlertDialog.Builder和setAdapter。PackageManager可以为您提供图标。谢谢你,这真的很有帮助。您有什么建议可以用来比较/过滤查询活动返回的列表和我的应用程序?我本来想用软件包的名称,但有没有更好的比较?@littleFluffyKitty:软件包名称几乎可以肯定是你最好的选择。这对我来说很有用。。只是我有一个关于targetedShareIntents.remove0的问题。。。为什么要这样做?因为您需要为选择器创建者方法提供一个意图,然后将其余的意图添加为一个额外的方法,否则将不起作用。它显示了奇怪的共享目标,并且有几个应用程序没有出现在列表中。谢谢你的灵感。