文章允许转载,请注明来源: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<ResolveInfo> 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.ShareImgUI
com.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原生分享到微博、微信等平台的实现方式