调用MediaStore.ACTION_VIDEO_CAPTURE传参闪退不传参无法获取视频如何解决
问题根因分析
从报错日志可直接定位核心异常:MediaStore.EXTRA_OUTPUT 要求传入实现Parcelable接口的Uri类型参数,代码中将Uri转为字符串传入,触发系统读取参数时的类型转换异常,导致闪退。
另外额外注意:Android 7.0(API 24)及以上版本禁止应用对外暴露file://类型的Uri,直接使用Uri.fromFile()传递给系统相机后续还会触发权限异常,需要同步适配。
修复步骤
第一步:修复参数类型错误
把错误代码:takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri.toString());替换为:
takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);即可解决当前类型转换导致的闪退问题。
第二步:适配Android 7.0+ 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"> <!-- 对应你代码中使用的Environment.getExternalStorageDirectory()/MyDir路径 --> <external-path name="my_video_path" path="MyDir/" /> </paths>- 修改Uri生成逻辑,兼容不同系统版本:
Uri mImageUri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 7.0及以上版本用FileProvider生成content://类型Uri mImageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", sdImageMainDirectory); } else { // 7.0以下版本可直接使用file://类型Uri mImageUri = Uri.fromFile(sdImageMainDirectory); } // 给系统相机应用授予Uri的读写权限 takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);- 在
第三步:权限与结果处理校验
- Android 6.0到Android 12版本需要先动态申请
WRITE_EXTERNAL_STORAGE权限,再调用相机 - 录制完成的结果回调中,不需要从返回的Intent里取Uri,直接读取你之前创建的
sdImageMainDirectory文件即可,设置EXTRA_OUTPUT后系统不会在返回结果中携带视频Uri。
- Android 6.0到Android 12版本需要先动态申请
内容的提问来源于stack exchange,提问作者Sam By
相关产品推荐
相关产品推荐

