You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:25:50