android原生分享遇到的一个小问题

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值