结论,不想要权限,也不想图片存在图库能看见的地方,就放在外置存储的自己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存储目录区别
- fileDir,/data/data/包名/files 只有自己的程序能访问(别的APP除非ROOT),一般存放文件
- cacheDir,/data/data/包名/caches 只有自己的程序能访问(别的APP除非ROOT),一般存放缓存
- getExternalFilesDir(null),/storage/Android/data/包名/files 只有自己的程序能访问(别的APP除非有内置),存放在外置存储(也就是一般
文件管理器
进去能看见的那些文件) - 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)
}
}
网友评论