android原生分享遇到的一个小问题
16lz
2021-01-24
文章允许转载,请注明来源: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原生分享到微博、微信等平台的实现方式
更多相关文章
- 调整Android手机的默认亮度
- 被谷歌控制的 Android(安卓)不是好 Android?
- Android(1)
- Android错误解决 Call requires API level 3 (current min is 1)
- Android(安卓)property属性机制
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
- 【Android】AndroidManifest 清单文件以及权限详解
- Android系统分析之带着问题看Handler
- carLife 车机端集成