文章允许转载,请注明来源:https://blog.csdn.net/feiniao8651/article/details/96902077

问题

在使用Android原生分享实现将一段文本分享到微信时,点击分享,发现分享的引用列表中并没有微信icon,但是有一个Android系统的选项,点击Android系统,就会显示微信的icon,包括发送到微信和添加到收藏两个选项。这里要解决的问题就是怎样在第一层的分享列表里就显示微信图标。
分享时显示Androjd系统:

点击这里的Android系统会看到微信分享的选项:

问题分析及解决

这里贴一下我的分享逻辑

    public void shareApplication() {        try {            Intent intent = new Intent(Intent.ACTION_SEND);            intent.setType("text/plain");            String shareText= getString(R.string.share_text);            List resInfo = getPackageManager().queryIntentActivities(intent, 0);            if(!resInfo.isEmpty()) {                List targetedShareIntents = new ArrayList();                for(ResolveInfo info : resInfo) {                    ActivityInfo activityInfo = info.activityInfo;                    Log.d(TAG, "activity packageName=" + activityInfo.packageName + " activity name=" + activityInfo.name);                    //过滤蓝牙                    if(activityInfo.packageName.contains("bluetooth") || activityInfo.name.contains("bluetooth")) {                        continue;                    }                    //过滤邮箱                    if(activityInfo.packageName.contains("email") || activityInfo.name.contains("email")) {                        continue;                    }                    Intent targeted = new Intent(Intent.ACTION_SEND);                    targeted.setType("text/plain");                    targeted.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name));                    targeted.putExtra(Intent.EXTRA_TEXT, shareText);                    targeted.setPackage(activityInfo.packageName);                    targetedShareIntents.add(targeted);                }                Intent openInChooser = Intent.createChooser((Intent)targetedShareIntents.remove(0), getString(R.string.choose_one));                openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));                startActivity(openInChooser);            }        }        catch(Exception e){        }    }

这里加了分享过滤的处理,把邮箱和蓝牙的分享给去掉了。
通过打印日志,可以看到通过queryIntentActivities实际上过滤出两个微信的分享Activity,分别是:

com.tencent.mm.ui.tools.ShareImgUIcom.tencent.mm.ui.tools.AddFavoriteUI

结合上面的问题截图,点击Android系统后会出两个微信相关的分享处理选项,那问题很有可能就是系统将同一个包名的两个分享合并到了一起,所以解决问题的方式就是在Intent里加入Activity信息。

Intent targeted = new Intent(Intent.ACTION_SEND);targeted.setType("text/plain");targeted.setComponent(new ComponentName(activityInfo.packageName, activityInfo.name));  //这里添加Activity信息targeted.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name));targeted.putExtra(Intent.EXTRA_TEXT, shareText);targeted.setPackage(activityInfo.packageName);targetedShareIntents.add(targeted);

之后分享就能正常显示微信icon了

后记

这个问题在不同的ROM上表现不同,有的ROM即使是Intent里不添加Activity信息也能显示出icon信息。我一开始测试的时候也没有发现,后来换了一台手机才出现这个问题。最稳妥的方式还是在Intent里加入Activity信息。
不过如果不加分享选项过滤,也没有这个问题,应该是ROM特定的逻辑导致的。

参考:
Android利用intent实现分享功能
获取Android系统分享列表
Android原生分享到微博、微信等平台的实现方式

更多相关文章

  1. 调整Android手机的默认亮度
  2. 被谷歌控制的 Android(安卓)不是好 Android?
  3. Android(1)
  4. Android错误解决 Call requires API level 3 (current min is 1)
  5. Android(安卓)property属性机制
  6. 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
  7. 【Android】AndroidManifest 清单文件以及权限详解
  8. Android系统分析之带着问题看Handler
  9. carLife 车机端集成

随机推荐

  1. Android(安卓)蓝牙学习
  2. 想要在 Android(安卓)體驗 Siri 嗎?快來試
  3. Android(安卓)属性动画使用(三)
  4. 从开发者角度看Android(安卓)和 IOS的前
  5. 基础总结篇之五:BroadcastReceiver应用详
  6. 诺基亚拒用Android顺理成章
  7. Android(安卓)Studio(7)---查找例子
  8. Android拦截电话与短信(电话拒接/短信拒收
  9. Android(安卓)Camera的使用(一)
  10. 活动总结:Android开发者的学习热情(CMDN Cl