Android 利用 intent 实现分享功能
一、 概述
现在的社会化分享大多使用了第三方的分享,例如友盟,ShareSDK 等等,当然也有使
用微信,QQ 等官方的 SDK 进行分享。不过这些方法比较繁琐,如果没有特别要求,只希望
将信息分享出去,我们可以利用安卓的 intent 来做这个事情。
二、 简单 Intent 的构建
在构建一个 intent 时,必须指定这个 intent 需要触发的 action。Android 定义了一些 actions,
比如 ACTION_SEND,该 action 表明该 intent 用于从一个 activity 发送数据到另外一个 activity
的,甚至可以是跨进程的数据发送。
为了发送数据到另一个 Activity,我们只需要指定数据和数据的类型,系统就会自动识
出能够接收这些数据类型的 Activity。如果选择有多个,就会把这些 Activity 显示给用户进行
选择;如果只有一个,则立即启动该 Activity。
下面列出一个简单的分享方式
putExtra()方法中放入的是分享的内容;
setType()设置分享的类型;
利用这样的分享方式进行分享时,会出现一个设置默认的选择,选定后,系统默认此类
型的分享内容一直使用选定的程序进行,这样显然不符合我们的分享需求。我们可以使用下
面的方法:
调用 Intent.createChooser()这个方法,此时即使用户之前为这个 intent 设置了默认,选
择界面还是会显示,并且我们可以指定选择界面的标题。
此外,我们不仅可以分享文字,还可以分享图片、视频、文件等。需要改变的就是 putExtra()
方 法 和 setType() 方 法 。 Intent.EXTRA_TEXT , 是 文 本 类 型 , 除 此 之 外 还 有 一 个 重 要
Intent.EXTRA_STREAM,在附件数据中的 EXTRA_STREAM 中放一个指向数据的 URI,就可
以来分享二进制数据。这个通常用来分享图片,也可以用来分享任何类型的二进制内容。如
下所示:
setType()方法根据要分享的内容的类型,还可以有“audio/mp4a-latm”、“audio/x-mpeg”、
“video/mp4”…很多类型。
三、 分享应用的过滤
通过上面的设置,我们会发现,系统弹出了很多方式,包括邮件、短信、蓝牙之类的,
有些应用我们不希望显示出来,我们就可以使用以下方法:
1、首先,我们定义一个图片的分享,继续沿用上面的方式,并添加一些判空机制:
2、然后获取匹配图片类型的应用信息列表:
3、接下来遍历这个集合,通过包名筛选出我们想要显示的应用(微信和 QQ):
在进行筛选时,需要注意的一点是 setType()方法是必须设置的,不然的话不能跳转
到选择的应用。
4、最后调用 createChooser 方法,显示分享 dialog
createChooser()方法最终展示给用户的选择包括,符合 createChooser 第一个参数的应用
以及由 EXTRA_INTENT_INTENTS 指定的应用。
效果图如下:
四、 多张图片的分享
上述方法都是对单个图片的分享,如果我们想要一次分享多张图片,要怎么做呢?其实
很 简 单 , 只 需 要 把 多 张 图 片 的 uri 装 进 一 个 集 合 里 , 并 将 action 设 置 为
ACTION_SEND_MULTIPLE 多个文件发送模式,并把 uri 集合传入即可,代码如下所示:
上述代码中将视频进行了过滤,并增加了一些判空机制。此处没有对分享应用进行过滤,
如果需要进行过滤,可以参考第三小节进行。
五、 总结
最后呢,总结一下利用 Android 原生实现分享和利用第三方 SDK 实现的优缺点,
如下表中所示:
分享类型
原生分享
第三方 SDK
优势
1.简单粗暴,轻松实现分
享功能
2.没有多余的架包和依赖
库
3. 无 需 去 申 请 繁 琐 的
AppKey
1.可以统一分享的界面风
格
2.支持网页分享和 App 直
接分享
3.分享类型比较多,封装
了分享内容的样式
劣势
1.系统会调出手机中所有
具有分享的功能的 App;
2.界面风格不统一跟随系
统的版本
3.如果没有安装需要分享
的指定 APP,则无法分享
1.需要添加大量依赖库和
架包
2. 需 要 去 申 请 繁 琐 的
AppKey
3.经常更新版本,兼容性
和稳定性不好