美文网首页
关于Android分享多图到微信和朋友圈的一些笔记

关于Android分享多图到微信和朋友圈的一些笔记

作者: 走在冷风中吧 | 来源:发表于2018-05-11 14:08 被阅读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), 暂时还没有找到解决办法

    相关文章

      网友评论

          本文标题:关于Android分享多图到微信和朋友圈的一些笔记

          本文链接:https://www.haomeiwen.com/subject/pxefdftx.html