使用Android Intent(Java)向WhatsApp等应用分享视频的问题求助
问题根因
- Android 7.0(API 24)以上禁止直接向第三方应用暴露本地文件路径,未授权的Uri会被目标应用识别为无效资源
- Android 10(API 29)及以上废弃了
MediaStore.Video.Media.DATA字段,你直接插入硬编码路径生成的Uri不符合系统规范,WhatsApp无法正常读取对应视频 - 你的分享Intent没有为目标应用授予临时读取权限,第三方应用无权访问你生成的媒体资源
修复方案
第一步:配置FileProvider(未配置的情况下)
首先在AndroidManifest.xml中添加FileProvider声明:
<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="external_files" path="." /> </paths>
第二步:修改分享逻辑代码
// 首先获取目标视频文件 File videoFile = new File("/storage/emulated/0/WhatsApp/Media/WhatsApp Video/VID-20210822-WA0002.mp4"); // 用FileProvider生成合规的共享Uri Uri videoUri = FileProvider.getUriForFile(getBaseContext(), getPackageName() + ".fileprovider", videoFile); Intent sharingIntent = new Intent(Intent.ACTION_SEND); // 明确指定MIME类型为video/mp4,避免通配符匹配错误 sharingIntent.setType("video/mp4"); sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "Title"); sharingIntent.putExtra(Intent.EXTRA_STREAM, videoUri); // 给目标应用授予临时读取Uri的权限 sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(sharingIntent, "share:"));
额外注意事项
- 如果你的应用适配Android 13及以上,需要提前申请
READ_MEDIA_VIDEO权限,否则无法读取本地视频文件 - 分享前可以先判断目标视频文件是否存在、是否有读取权限,避免无效分享
- 不要使用
video/*通配符作为MIME类型,明确指定为对应视频格式的MIME类型可以大幅提升第三方应用的兼容性
内容的提问来源于stack exchange,提问作者Abhay
相关产品推荐
相关产品推荐

