Android中用Kotlin+Intent分享图片至WhatsApp等应用的问题排查
解决Android分享图片到WhatsApp的常见坑点
一、先搞定文件存在性和FileProvider配置
1. 确保文件真的存在,路径没搞错
- 别依赖adb导入的临时文件,最好把图片放到
files/images或者cache目录里,用代码把资源文件复制过去:// 从assets复制示例图到内部存储 val inputStream = assets.open("sample.jpg") val outputFile = File(filesDir, "images/sample.jpg") outputFile.parentFile?.mkdirs() // 先创建目录 FileOutputStream(outputFile).use { outputStream -> inputStream.copyTo(outputStream) } - 用
File.exists()验证,日志打绝对路径确认:Log.d("ShareDebug", "文件路径: ${outputFile.absolutePath}, 是否存在: ${outputFile.exists()}")
2. 修正FileProvider的配置
- 自定义
MyFileProvider直接继承就行,别瞎重写方法:class MyFileProvider : FileProvider() AndroidManifest.xml里的authority要唯一,grantUriPermissions必须开true:<provider android:name=".MyFileProvider" android:authorities="com.your.package.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>file_paths.xml要对应你放文件的路径,比如指向内部files下的images目录:<?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="images" path="images/" /> </paths>
二、分享Intent的正确姿势
1. 生成Content URI后必须给权限
- 拿到URI后,一定要给目标应用临时读权限,WhatsApp对这个要求很严:
val fileUri = FileProvider.getUriForFile( this, "com.your.package.fileprovider", outputFile ) // 给所有能接收这个Intent的应用开权限 grantUriPermission( "*", fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION )
2. 别漏了正确的MIME类型
- WhatsApp对MIME类型校验死严,必须指定准确的类型:
val shareIntent = Intent(Intent.ACTION_SEND).apply { type = "image/jpeg" // 图片是png就改成image/png putExtra(Intent.EXTRA_STREAM, fileUri) // 强制指定MIME类型,防止系统猜错 putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg")) // 带上权限FLAG flags = Intent.FLAG_GRANT_READ_URI_PERMISSION } startActivity(Intent.createChooser(shareIntent, "分享图片")) - 单张图就用
ACTION_SEND,别瞎用ACTION_SEND_MULTIPLE。
三、资源URI分享导致WhatsApp发null.bin的解决办法
android.resource://这种URI WhatsApp不认,它没法直接读应用资源文件。必须把资源文件复制到内部/外部可访问的目录,再用FileProvider生成Content URI分享,步骤就按第一步的资源复制来。
四、额外排查项
- 检查图片有没有损坏:用adb pull把文件导到电脑,看看能不能正常打开。
- 先测其他应用(比如微信、邮件),如果能正常接收,那就是WhatsApp的适配问题,重点核对MIME类型和文件后缀是否匹配。
- Android 10+别用外部公共目录,除非你申请了存储权限,最好用内部存储或者MediaStore。
内容的提问来源于stack exchange,提问作者Prakhar_Pathak
相关产品推荐
相关产品推荐

