美文网首页
Android接入`QQ分享`SDK纯图片分享解决方案(URI、

Android接入`QQ分享`SDK纯图片分享解决方案(URI、

作者: 小强开学前 | 来源:发表于2019-11-01 14:13 被阅读0次

    结论,不想要权限,也不想图片存在图库能看见的地方,就放在外置存储的自己app的私有目录,也就是internalFileDir或者internalCacheDir,虽然理论上这个目录也不是APP互通的,但是有外置存储权限的APP可以直接访问,而QQ这么流氓的应用怎么可能没有这个权限?

    下面是使用SDK的方法

      if (MuseUtil.getT().isQQInstalled(activity!!)) {
                    showLoading()
                    Observable.create<Uri> {
                       val uri = xxx
                 }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe {
                        dismissLoading()
                        val bundle = Bundle()
                        bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE)// 设置分享类型为纯图片分享
                        bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, it.toString())// 需要分享的本地图片URL
                        bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE)
                        MuseUtil.getT().shareToQQ(activity!!, bundle, object : IUiListener {
                            override fun onComplete(p0: Any?) {
                                behavior.state = BottomSheetBehavior.STATE_COLLAPSED
                                MuseUtil.toast("分享完成")
                            }
    
                            override fun onCancel() {
                                MuseUtil.toast("取消分享")
                            }
    
                            override fun onError(p0: UiError?) {
                                Log.d("TAG", p0?.errorDetail + ":::" + p0?.errorCode + ":::" + p0?.errorMessage)
                                MuseUtil.toast(R.string.unknown_error)
                            }
    
                        })
                    }
                } else {
                    MuseUtil.toast(R.string.qq_is_not_install)
                }
    
    

    上面是官方要求的分享方式,需要在bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, imgPath)
    这个地方,传入本地图片的Path(QQ团队叫URL,呵呵),而如果要分享,则这个图片需要能被QQ访问,意味着我们不能存在Android规定的App的私有目录。

    作为一个体面的开发者,我完全不能接受为了一个QQ分享多去申请一个权限。

    当然也有另外一种解决方案,就是通过MediaStore存入Picture或者Download这样的公共文件夹,然后分享完成再删除......且不说这种方式多费时费力,整个体验LOW到无以复加。

    翻看QQ的SDK源代码这个逻辑写得...

    然后研究了下Android存储目录区别

    1. fileDir,/data/data/包名/files 只有自己的程序能访问(别的APP除非ROOT),一般存放文件
    2. cacheDir,/data/data/包名/caches 只有自己的程序能访问(别的APP除非ROOT),一般存放缓存
    3. getExternalFilesDir(null),/storage/Android/data/包名/files 只有自己的程序能访问(别的APP除非有内置),存放在外置存储(也就是一般文件管理器进去能看见的那些文件)
    4. getExternalCacheDir(),/storage/Android/data/包名/cache 只有自己的程序能访问(别的APP除非有内置),存放在外置存储(也就是一般文件管理器进去能看见的那些文件)

    很明显,3,4都可以

    另外如果不想用SDK,可以用下面这个,但是不能跳转回原APP

       fun shareToQQ() {
            if (MuseUtil.getT().isQQInstalled(activity)) {
                Observable.create<Uri> {
                    it.onNext(MuseUtil.bitmap2File(activity!!, shareImagePath, MuseUtil.convertLayoutToBitmap(layout_share)))
                }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe {
                    val bundle = Bundle()
                    bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE)// 设置分享类型为纯图片分享
                    bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL,shareImagePath)// 需要分享的本地图片URL
                    bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE)
                    MuseUtil.getT().shareToQQ(activity!!, bundle, object : IUiListener {
                        override fun onComplete(p0: Any?) {
                            behavior.state = BottomSheetBehavior.STATE_COLLAPSED
                            MuseUtil.toast("分享完成")
                        }
    
                        override fun onCancel() {
                            MuseUtil.toast("取消分享")
                        }
                        override fun onError(p0: UiError?) {
                            Log.d("TAG", p0?.errorDetail + ":::" + p0?.errorCode + ":::" + p0?.errorMessage)
                            MuseUtil.toast(R.string.unknown_error)
                        }
    
                    })
                }
            }else{
                MuseUtil.toast(R.string.qq_is_not_install)
            }
        }
    

    相关文章

      网友评论

          本文标题:Android接入`QQ分享`SDK纯图片分享解决方案(URI、

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