Android自定义分享选择器出现多Facebook/Twitter图标,如何仅显示单个?
解决Android分享选择器重复显示社交应用图标的问题
你遇到的重复图标问题,根源在于部分社交应用(比如Facebook、Twitter)内部有多个Activity都注册了支持ACTION_SEND的过滤器,而你的代码目前会给每个匹配的Activity都创建一个独立的Intent,自然就会在选择器里显示多个相同应用的图标。
要解决这个问题,我们只需要按包名去重,同一个目标应用只保留一个Intent即可,修改后的代码如下:
public void customShare() { if (file.exists()) { Uri uri = Uri.fromFile(file); List<Intent> targetedShareIntents = new ArrayList<Intent>(); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/jpeg"); intent.putExtra(Intent.EXTRA_STREAM, uri); List<ResolveInfo> resInfo = this.getPackageManager().queryIntentActivities(intent, 0); // 新增HashSet记录已添加的包名,避免重复 HashSet<String> addedPackages = new HashSet<>(); for (ResolveInfo resolveInfo : resInfo) { String packageName = resolveInfo.activityInfo.packageName; // 先检查包名是否在目标列表,且未被添加过 if ((packageName.equals("com.facebook.katana") || packageName.equals("ru.ok.android") || packageName.equals("com.vkontakte.android") || packageName.equals("com.twitter.android")|| packageName.equals("com.whatsapp") || packageName.equals("org.telegram.messenger") || packageName.equals("com.google.android.apps.plus")) && !addedPackages.contains(packageName)) { Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND); targetedShareIntent.setType("image/jpeg"); targetedShareIntent.putExtra(Intent.EXTRA_STREAM, uri); targetedShareIntent.setPackage(packageName); targetedShareIntents.add(targetedShareIntent); addedPackages.add(packageName); // 添加后标记为已处理 } } if (!targetedShareIntents.isEmpty()) { Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), ""); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{})); startActivity(chooserIntent); } } }
关键修改说明:
- 新增了
HashSet<String> addedPackages,用来记录已经添加到分享列表的包名,确保同一个应用只被添加一次 - 在遍历
ResolveInfo时,先判断包名是否属于目标应用,同时检查是否已经被添加过,只有满足两个条件才创建并添加Intent - 额外增加了
!targetedShareIntents.isEmpty()的判断,避免当没有目标应用时出现空指针异常
这样修改后,每个目标社交应用就只会在分享选择器里显示一个图标啦!
内容的提问来源于stack exchange,提问作者Bek
相关产品推荐
相关产品推荐

