通过系统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")!!)
}