关于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), 暂时还没有找到解决办法

上一篇下一篇

猜你喜欢

热点阅读