Android应用如何避免自身出现在自身发起的图片分享选择器中?
解决方案
你可以通过以下两种方案实现需求,既保留其他应用唤起你应用的能力,又能在自身发起分享时排除自己的应用:
方案1:API 30(Android 11)及以上原生实现
系统从API 30开始提供了Intent.EXTRA_EXCLUDE_COMPONENTS参数,可以直接指定要从分享选择器中排除的组件,无需额外适配逻辑,代码修改如下:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri); shareIntent.setType("image/png"); // 构造要排除的自身应用组件 ComponentName excludeComponent = new ComponentName(getPackageName(), MyPicAppActivity.class.getName()); Intent chooser = Intent.createChooser(shareIntent, "Share My Pic App Image"); // 传入排除的组件数组 chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, new ComponentName[]{excludeComponent}); startActivityForResult(chooser, SHARE_RESPONSE_CODE);
方案2:兼容全版本的自定义过滤方案
如果你的应用需要支持API 30以下的设备,可以先自行查询所有符合分享条件的应用,过滤掉自身后再构造选择器:
- 首先在
AndroidManifest.xml中添加查询权限适配(Android 11及以上查询其他应用信息需要声明):
<queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/*" /> </intent> </queries>
- 修改分享逻辑代码:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType("image/png"); shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri); // 查询所有匹配的分享应用 List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(shareIntent, 0); List<Intent> targetIntents = new ArrayList<>(); for (ResolveInfo info : resolveInfos) { String packageName = info.activityInfo.packageName; // 过滤掉自身应用 if (packageName.equals(getPackageName())) { continue; } // 构造目标应用的分享Intent Intent target = new Intent(Intent.ACTION_SEND); target.setComponent(new ComponentName(packageName, info.activityInfo.name)); target.setType("image/png"); target.putExtra(Intent.EXTRA_STREAM, shareUri); targetIntents.add(target); } if (!targetIntents.isEmpty()) { // 用第一个Intent作为基础,传入剩下的所有Intent构造选择器 Intent chooser = Intent.createChooser(targetIntents.remove(0), "Share My Pic App Image"); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[0])); startActivityForResult(chooser, SHARE_RESPONSE_CODE); }
两种方案可以结合使用,判断系统版本≥30时用原生方案,否则用自定义过滤方案,即可覆盖所有设备场景。
内容的提问来源于stack exchange,提问作者kralvarado
相关产品推荐
相关产品推荐

