Android Nougat设备中MediaStore.ACTION_VIDEO_CAPTURE预览播放崩溃
解决系统相机录制视频后预览播放崩溃的问题
看起来你遇到的是调用系统相机录制视频后,在系统默认预览界面点击播放导致应用直接崩溃的问题,结合你的代码片段,我整理了几个可能的原因和对应的解决方案:
一、修复前置相机参数的兼容性问题
你代码里使用的"android.intent.extra.USE_FRONT_CAMERA"并不是Android官方标准的Intent Extra字段,不同厂商的系统相机对这个非标准参数的支持差异很大,甚至可能导致录制的视频文件出现异常,进而引发播放崩溃。
建议替换为官方推荐的相机朝向参数(适配大多数系统):
// 替换原有的前置相机参数 videoIntent.putExtra(MediaStore.EXTRA_CAMERA_FACING, Camera.CameraInfo.CAMERA_FACING_FRONT); // 针对Android 21以下的低版本系统,可尝试直接传入数值1替代常量 // videoIntent.putExtra(MediaStore.EXTRA_CAMERA_FACING, 1);
二、确认权限配置完整
录制视频需要必要的权限支撑,缺少权限可能导致视频文件写入异常,最终触发播放崩溃:
- Android 10及以下:需要在Manifest中声明
CAMERA和WRITE_EXTERNAL_STORAGE权限,同时要在运行时动态申请这两个权限。 - Android 11及以上:
WRITE_EXTERNAL_STORAGE权限被弱化,但仍需CAMERA权限,录制的视频会默认存入公共媒体库,无需额外存储权限。
Manifest权限声明示例:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.front" />
三、正确处理相机返回的结果
确保你在处理相机返回结果时,对视频Uri做了严谨的判空和权限校验,避免空指针或无权限读取的情况:
如果使用旧版startActivityForResult,处理逻辑示例:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) { // 获取返回的视频Uri Uri videoUri = data.getData(); if (videoUri != null) { // 此处可安全处理视频(如播放、存储),注意不要直接修改Uri指向的文件 } else { Log.e("VideoCapture", "返回的视频Uri为空,可能录制过程异常"); } } }
如果是AndroidX推荐的ActivityResultContracts方式,实现示例:
ActivityResultLauncher<Intent> videoCaptureLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { Uri videoUri = data.getData(); // 安全处理视频Uri } } } ); // 调用相机时直接使用launcher启动 videoCaptureLauncher.launch(videoIntent);
四、排查崩溃的具体原因
虽然你说应用没有报错直接崩溃,但建议通过Android Studio的Logcat查看崩溃堆栈信息,重点关注这几类异常:
NullPointerException:大概率是返回的Uri为空或处理时未判空SecurityException:权限不足导致无法读取视频文件IOException:录制的视频文件损坏或无法正常读取
根据堆栈信息能更精准地定位问题根源。
内容的提问来源于stack exchange,提问作者Priyanka Valecha
相关产品推荐
相关产品推荐

