关于Android分享多图到微信和朋友圈的一些笔记
2018-05-11 本文已影响680人
走在冷风中吧
当产品有些变态需求的时候, 你总是需要笑一笑并且满足他
Android分享我们都是使用的Umeng, 但是在一些时候, Umeng并满足不了我们.
友盟对于多图分享只支持qq空间及新浪微博, 但是产品此时还想实现分享到微信, 就需要我们另辟蹊径了
以下为实现代码(使用的是Kotlin实现):
fun share(){
if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE || share_media == SHARE_MEDIA.WEIXIN) { //多图分享到微信及朋友圈
//微信分享多图只支持本地图片, 所以先要进行图片缓存, 记得删除缓存文件
val intent = Intent()
if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE) {
intent.component = ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI")
} else {
intent.component = ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI")
}
intent.action = Intent.ACTION_SEND_MULTIPLE
intent.type = "image/*"
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
showLoadingDialog()
//权限判断
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
shareMultiPic2Wechat(intent, share_media)
} else {
toast("请打开相关权限")
}
} else {
shareMultiPic2Wechat(intent, share_media)
}
}
/**
* 分享多图到微信好友及朋友圈
*/
private fun shareMultiPic2Wechat(intent: Intent, share_media: SHARE_MEDIA) {
val imageUris = ArrayList<Uri>()
val imagePaths = mutableListOf<String>()
Observable.just(mViewModel.checkedList).map {
try {
for (bean in it) {
val bitmap = FileUtil.url2bitmap2(bean.template, this)
//将文件进行缓存
val file = FileUtil.saveBitmap2File(this, bitmap)
imagePaths.add(file.absolutePath)
imageUris.add(Uri.fromFile(file))
}
} catch (e: Exception) {
e.printStackTrace()
}
return@map imageUris
}.compose(RxUtil.rxSchedulerHelper())
.compose(this.syncLifecycle())
.subscribe(
{
val requestCode = if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE) REQUEST_SHARE2WEIXIN else REQUEST_SHARE2WEIXINCIRCLE
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, it)
startActivityForResult(intent, requestCode)
},
{ showDialogError(it) },
{ complete() })
}
实现机制是通过intent打开第三方应用的页面.
坑1:
通过这种方式只能分享本地图片,mViewModel.checkedList
在我的项目及大多数项目中都有可能是网路图片, 所以这里还涉及到了需要先将图片缓存本地,然后才可以分享
//将文件进行缓存
val bitmap = FileUtil.url2bitmap2(bean.template, this)
val file = FileUtil.saveBitmap2File(this, bitmap)
坑2:AndroidN以上FileUriExposedException
当需要保存到本地再进行分享时, 在android7.0以上会遇到FileUriExposedException问题, 原因是7.0以上对于android文件读取做了更严格的限制,在网上百度到了大多是类似这个博客的做法https://blog.csdn.net/yy1300326388/article/details/52787853
我试了之后, 分享时会提醒说分享文件类型只能是照片,后来又发现了另一种解决办法:
在baseApplication里onCreate接口中加入以下代码,别的跳转代码还是使用原样,就可以分享成功啦~
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
坑3: 使用这种方式分享没有办法监听到分享成功或失败,
尝试使用了`startActivityForResult(intent, requestCode)
' 但是返回activity后拿到的resultCode 始终是0(RESULT_CANCLE), 暂时还没有找到解决办法