美文网首页
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