使用Intent.createChooser分享图片时主题与文本不显示如何解决
问题分析与解决方案
出现该问题主要是现有代码存在3个适配缺陷,导致接收分享的应用无法正常识别全部附加内容:
- Uri生成方式不规范:Android 7.0(API 24)及以上禁止使用
file://格式Uri跨应用传递文件,强制要求使用content://格式Uri,部分应用识别file://Uri异常时,会自动忽略EXTRA_SUBJECT、EXTRA_TEXT等附加参数 - MIME类型设置不合理:当前仅设置
shareIntent.type = "image/jpeg",仅声明分享内容为图片,大部分应用接收该类型分享时,只会优先读取EXTRA_STREAM的图片资源,自动忽略文本类内容 - 临时修改StrictMode的VM策略属于违规适配,存在权限泄露风险,会加剧系统兼容性问题
修复步骤
1. 先配置FileProvider
首先在AndroidManifest.xml的<application>标签下添加Provider配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
在res/xml目录下新建file_paths.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="pictures" path="Pictures/" /> </paths>
2. 调整分享逻辑
修正后的代码如下:
fun share(charityName: String, url: String) { val bitmap = logoHolder.drawToBitmap() val picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val shareFile = File(picDir, "share.jpeg") // 保存Bitmap到本地 try { FileOutputStream(shareFile).use { out -> bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) } } catch (e: Exception) { e.printStackTrace() return } // 生成合规的content://格式Uri val bmpUri = FileProvider.getUriForFile( this, "${packageName}.fileprovider", shareFile ) val shareIntent = Intent(Intent.ACTION_SEND).apply { // 声明分享内容包含多种类型,让接收方读取全部参数 type = "*/*" putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.invite_subject)) putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.inviteWithUrl, charityName, url)) putExtra(Intent.EXTRA_STREAM, bmpUri) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(shareIntent, "Share")) }
注意事项
- 部分应用本身不支持同时接收图片+文本+主题的分享内容,只会取其中某一类内容展示,这是接收方应用的限制,不属于发送端问题
- 适配Android 13及以上需要提前申请
READ_MEDIA_IMAGES权限,适配Android 10以下需要申请WRITE_EXTERNAL_STORAGE权限
内容的提问来源于stack exchange,提问作者andrewedgar
相关产品推荐
相关产品推荐

