分享功能是app中特别常见的功能,国内的app基本都支持分享到微信 QQ等主流的社交应用。至于分享功能的实现大多是使用第三方的share sdk一步到位,或者分享的app比较少比如就一个微信 那通常使用微信sdk的分享模块即可。但其实android系统就给我们提供过一种分享的实现方式,代码也比较简单如下
Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_TEXT, shareText); share.putExtra(Intent.EXTRA_SUBJECT, shareSubject); if (uri != null) { share.setType("image/*"); share.putExtra(Intent.EXTRA_STREAM, uri); } context.startActivity(Intent.createChooser(share, title));
系统提供的短短不到十行代码,将分享列表 数据 展示 点击 跳转 跳转后分享内容的分享等一系列动作都集合完成了。这样确实给人干净利索的感觉,但随之问题也来了比如我分享列表中只有特定几个app,甚至把某个app放在第一个,还有点击Facebook的分享后分享方式我想用facebooksdk自带的,等等一些列自定义功能完成就比较麻烦。
对个别app的分享特别处理
从以上的代码可以看出,google官方定义出分享的key value一一对应规则。比如Intent.EXTRA_STREAM对应为分享图片的uri,Intent.EXTRA_TEXT对应为分享的text文本。从道理上讲如果分享到的app都遵循google定义的这规则我们就能通过官方这代码实现分享到所有app的功能。然而理想很丰满现实很骨感,比如我们项目中要求分享到的facebook就压根不遵守这规则,我们想实现分享到Facebook就必须用其sdk实现。于是我们就需要在分享列表中点击Facebook是单独走Facebook的分享逻辑。
第一步:获取分享列表的数据
private static List<List<ResolveInfo>> getShareActivities() { Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); PackageManager pm = App.getInstance().getPackageManager(); List<List<ResolveInfo>> listArrayList = new ArrayList<>(); List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0); List<ResolveInfo> newActivityList = new ArrayList<>(); for (Iterator<ResolveInfo> it = activityList.iterator(); it.hasNext(); ) { ResolveInfo info = it.next(); //过滤出facebook google+ whatapp twitter 分享app单独处理 LogUtils.e("+++", info.activityInfo.packageName); if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc") || info.activityInfo.packageName.equals("com.facebook.katana") || info.activityInfo.packageName.equals("com.google.android.apps.plus") || info.activityInfo.packageName.equals("com.facebook.orca") || info.activityInfo.packageName.contains("whatsapp") || info.activityInfo.packageName.equals("com.twitter.android")) { if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc")) { it.remove(); } else { newActivityList.add(info); it.remove(); } } } //增加一条other数据 newActivityList.add(null); listArrayList.add(newActivityList); listArrayList.add(activityList); return listArrayList; }
第二步:构建分享的列表,且定义点击事件等
public static void systemShareDialog(List<ResolveInfo> packages, Context context, String title, String shareText) { List<Intent> targetIntents = new ArrayList<Intent>(); Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); SPM spm = new SPM(); for (ResolveInfo candidate : packages) { String packageName = candidate.activityInfo.packageName; Intent target = new Intent(android.content.Intent.ACTION_SEND); target.setType("text/plain"); target.putExtra(Intent.EXTRA_TEXT, shareText); //target.setPackage(packageName); //t will be able to handle the case of multiple activities within the same app that can handle this intent. Otherwise, a weird item of "Android System" will be shown target.setComponent(new ComponentName(packageName, candidate.activityInfo.name)); targetIntents.add(target); } // createchooser时使用targetIntents.remove(0)即传入targetIntents的第一个intent,并将其移除, // // 否则执行chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));添加后启动时会出现两个相同的应用 Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{})); context.startActivity(chooserIntent); }
总结
至此完成了基于android系统提供的分享方式上的扩展改造,自定义分享列表数据展示 自定义点击后的分享形式等等都可以实现。。其实此功能中Intent.createChooser所做工作还是蛮多的,有兴趣童鞋可以再去扒下起源码,看具体实现和到底做了哪些工作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android系统自带分享图片功能,包括了Android系统自带分享图片功能的使用技巧和注意事项,需要的朋友参考一下 简介 记录一个利用系统分享功能进行图片分享的工具类(代码是用Kotlin写的,都是比较简单的语法,部分可能需要自定义的地方都已经标出)。调用方式比较简单: 权限 记得添加文件操作权限, 另外需要注意6.0版本以上的权限管理 具体细节见代码 以上就是本文的全部内容,希望
本文向大家介绍bootstrap栅格系统示例代码分享,包括了bootstrap栅格系统示例代码分享的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了bootstrap栅格系统的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍Mybatis Plus 自定义方法实现分页功能的示例代码,包括了Mybatis Plus 自定义方法实现分页功能的示例代码的使用技巧和注意事项,需要的朋友参考一下 一般物理分页,即通过sql语句分页,都是在sql语句后面添加limit分页语句,在xml文件里传入分页的参数,再多配置一条sql,用于查询总数: 这样可以实现分页,但是每条sql都这样写,很冗余,而且不好维护,
本文向大家介绍Java实现的自定义迭代器功能示例,包括了Java实现的自定义迭代器功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的自定义迭代器功能。分享给大家供大家参考,具体如下: 编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用“foreach”循环遍历你的对象。 执行结果: 希望本文所述对大家java程序设计有所帮
本文向大家介绍Android 分享功能的实现代码,包括了Android 分享功能的实现代码的使用技巧和注意事项,需要的朋友参考一下 Android 分享功能的实现代码 一个Activity中,取出设备上安装的所有支持分享动作的Activity,在grid中显示。 实例代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍arcgis android之定位功能的示例代码,包括了arcgis android之定位功能的示例代码的使用技巧和注意事项,需要的朋友参考一下 关于定位的功能,开发,很早之前就有做过百度的定位功能。起初是有想法把百度的Loc V3.2的定位SDK整合进来用。但是终归是想法,但是知道昨天,我问技术群,里面的一位朋友就说起了百度地位SDK整合进来的实现方法。顿时,我就思考了一会,随后就