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

当产品有些变态需求的时候, 你总是需要笑一笑并且满足他
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), 暂时还没有找到解决办法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容