Android Q 10 调不起来原生微信分享

通过系统Intent调用微信分享图片

Android Q 以下的(Android 10)都可以,经过多次分析,发现是因为,android10 图片绝对路径转成uri出现了问题。Q及以上的把本地文件转成URI 会失效。

先看系统调用微信,指定调起朋友圈,还是微信好友的方式
一,检测是否有安装微信

/**
 * 微信相关的工具类
 */
object WcUtils {

    //判断是否安装了微信
    fun isWeixinAvilible(context: Context): Boolean {
        val packageManager = context.packageManager// 获取packagemanager
        val pinfo = packageManager.getInstalledPackages(0)// 获取所有已安装程序的包信息
        if (pinfo != null) {
            for (i in pinfo.indices) {
                val pn = pinfo[i].packageName
                if (pn == "com.tencent.mm") {
                    return true
                }
            }
        }
        return false
    }


    /**
     * 弹窗微信下载对话
     */
    fun checkWcInstall(context: AppCompatActivity) {
        val builder = AlertDialog.Builder(context)
        builder.setTitle("温馨提示")
        builder.setMessage("您还没有安装手机微信客户端,是否先下载微信客户端?")
        builder.setPositiveButton("下载微信") { it, _ ->
            downloadWechat(context)
            it.cancel()
        }
        builder.setNegativeButton("取消") { it, _ ->
            it.cancel()
        }
        builder.show()
    }

    /**
     * 下载微信
     */
    private fun downloadWechat(context: Context) {
        context.startActivity(Intent("android.intent.action.VIEW", Uri.parse("https://6c947dee0a32d9387096de83959c951b.dd.cdntips.com/imtt.dd.qq.com/16891/D21910E083EA4C497C5BD59A76C5577B.apk?mkey=5c1844beb70d9bd8&f=8917&fsname=com.tencent.mm_6.7.3_1360.apk&csr=1bbd&cip=183.13.189.45&proto=https")))
    }


}

二,分享

/**
 * 微信分享的工具类
 */
 

 


/**
 * 微信分享的工具类
 */
object WcShareUtils {

    /**
     * 分享文件到微信
     */
    @SuppressLint("CheckResult")
    fun shareImages(context: Context, file: File) {
        if (!WcUtils.isWeixinAvilible(context)) {
            WcUtils.checkWcInstall(context as AppCompatActivity)
        } else {
            try {
                val intent = Intent()
                val comp = ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI")
                intent.component = comp
                intent.action = Intent.ACTION_SEND_MULTIPLE
                intent.type = "image/*"
                val imageUris = ArrayList<Uri>()
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
                    //android Q
                    var uri = getImageContentUri(context, file)
                    uri?.let { imageUris.add(it) }
                } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {
                    //修复微信在7.0崩溃的问题
                    var uri = Uri.parse(MediaStore.Images.Media.insertImage(context.contentResolver, file.absolutePath, file.name, null))
                    imageUris.add(uri)
                } else {

                    imageUris.add(Uri.fromFile(file))
                }
                intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                context.startActivity(intent)
            } catch (e: Exception) {
                LogUtlis.e(e.toString())
                e.printStackTrace()
            }
        }
    }

    /**
     * 调用系统分享
     */
    fun shareAll(context: Context, shareUrl: String?) {
        if (shareUrl == null) return
        val file = ImageUtils.saveImageUrlToFile(shareUrl)
        shareAll(context, file)
    }

    fun shareAll(context: Context, file: File?) {
        try {
            if (file == null) return
            val intent = Intent(Intent.ACTION_SEND)
            intent.type = "image/jpeg"
            intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(MediaStore.Images.Media.insertImage(context.contentResolver, file.absolutePath, "invite_face.jpg", null)))
            context.startActivity(Intent.createChooser(intent, "分享到"))
        } catch (e: Exception) {
            LogUtlis.e(e)
        }
    }

    /**
     * 分享图片到微信朋友圈
     */
    fun sharePictureToTimeLine(context: Context, picFile: File) {
        if (!WcUtils.isWeixinAvilible(context)) {
            WcUtils.checkWcInstall(context as AppCompatActivity)
        } else {
            val intent = Intent()
            val comp = ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI")
            intent.component = comp
            intent.action = Intent.ACTION_SEND
            intent.type = "image/*"
            var uri: Uri? = null
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
                //android Q 10
                uri = getImageContentUri(context, picFile)
                Log.e("微信分享:Q 10", "$uri")
            } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {
                //修复微信在7.0崩溃的问题
                uri = Uri.parse(
                        MediaStore.Images.Media.insertImage(
                                context.contentResolver,
                                picFile.absolutePath,
                                picFile.name,
                                null
                        )
                )
            } else {
                Log.e("微信分享", "分享到朋友圈-5")
                uri = Uri.fromFile(picFile)
            }
            Log.e("微信分享:uri", "$uri")
            intent.putExtra(Intent.EXTRA_STREAM, uri)
            intent.putExtra("Kdescription", "")
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            context.startActivity(intent)

        }
    }

    /**
     * android  Q 10 文件转成 URI
     */
    fun getImageContentUri(context: Context, imageFile: File): Uri? {
        val filePath = imageFile.absolutePath
        val cursor: Cursor? = context.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, arrayOf(MediaStore.Images.Media._ID), MediaStore.Images.Media.DATA + "=? ", arrayOf(filePath), null)
        return if (cursor != null && cursor.moveToFirst()) {
            val id: Int = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID))
            val baseUri = Uri.parse("content://media/external/images/media")
            Uri.withAppendedPath(baseUri, "" + id)
        } else {
            if (imageFile.exists()) {
                val values = ContentValues()
                values.put(MediaStore.Images.Media.DATA, filePath)
                context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
            } else {
                null
            }
        }
    }
    /**
     *
     * 小米:”
     * E/微信分享: 分享到朋友圈-2
    E/微信分享:absolutePath: /storage/emulated/0/DCIM/invite_face.jpg
    E/微信分享:name: invite_face.jpg
    E/微信分享:absolutePath: content://media/external/images/media/1058385
    android 10
    E/微信分享: 分享到朋友圈-2
    E/微信分享:absolutePath: /storage/emulated/0/DCIM/invite_face.jpg
    E/微信分享:name: invite_face.jpg


     */

    /**
     * 微信分享
     */
    fun shareWebMsg(context: Context, shareBean: ShareBean) {
        val webpage = WXWebpageObject()
        webpage.webpageUrl = shareBean.shareLink
        val msg = WXMediaMessage(webpage)
        msg.title = shareBean.shareTitle
        msg.description = shareBean.shareDescribe
        val thumbBmp = if (TextUtils.isEmpty(shareBean.shareLogo)) {
            BitmapFactory.decodeResource(context.resources, GlobalConfig.AppLogoID)
        } else {
            ImageUtils.saveImageUrlToBitmap(shareBean.shareLogo!!)
        }
        msg.setThumbImage(thumbBmp)
        val req = SendMessageToWX.Req()
        req.transaction = "webpage"
        req.message = msg
        req.scene = if (shareBean.platform == "wechat_moments") SendMessageToWX.Req.WXSceneTimeline else SendMessageToWX.Req.WXSceneSession
        BaseApplication.mWxApi.sendReq(req)

    }
}

三,使用

btn.setOnClick{

 WcShareUtils.shareImages(this@BindWcActivity,ImageUtils.saveImageToFile(this, mBitmap!!, "bind_wc.jpg")!!)


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值