Flutter Camera录制前后置视频:Android11/12前置视频无法显示求助
解决Flutter Camera在Android 11/12前置摄像头视频录制后无法显示及录制后打开视频的问题
一、前置摄像头视频无法显示的排查与修复
1. 适配Android 11+权限配置
Android 11开始收紧媒体文件访问权限,需在AndroidManifest.xml中补充必要权限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.front" />
同时,Android 10+建议优先使用MediaStore保存视频文件,避免直接操作外部存储路径引发权限问题。
2. 修正录制方向与参数
前置摄像头录制的视频常因方向错误导致无法正常显示,需在初始化时配置正确的视频方向:
final frontCamera = await availableCameras().then((cameras) => cameras.firstWhere((cam) => cam.lensDirection == CameraLensDirection.front) ); final controller = CameraController( frontCamera, ResolutionPreset.medium, enableAudio: true, ); // 绑定录制控制器时指定视频方向 final recorder = CameraVideoRecorderController( controller, videoOrientation: await controller.getVideoOrientation(), );
确保录制格式为Android原生支持的mp4格式,避免使用小众编码格式。
3. 适配Android 11+文件保存逻辑
不要直接使用getExternalStorageDirectory()存储视频,改用MediaStore将文件插入系统媒体库,确保系统能正确索引视频:
Future<String> saveVideoToMediaStore(String tempFilePath) async { final contentValues = ContentValues({ MediaStore.Video.Media.DISPLAY_NAME: "front_video_${DateTime.now().millisecondsSinceEpoch}.mp4", MediaStore.Video.Media.MIME_TYPE: "video/mp4", MediaStore.Video.Media.RELATIVE_PATH: Environment.DIRECTORY_MOVIES, }); final uri = await MediaStore.Video.Media.insertMediaStore( context, contentValues, tempFilePath, MediaStore.DirectoryMovies, ); return uri.toString(); }
录制时先将视频保存到临时目录,再通过上述方法插入媒体库,避免文件无法被系统识别。
二、录制后打开对应摄像头的视频
1. 使用open_file插件打开视频
在pubspec.yaml中添加依赖:
dependencies: open_file: ^3.3.2
录制完成后,根据保存的文件路径/Uri调用打开方法:
import 'package:open_file/open_file.dart'; void openRecordedVideo(String videoPath) async { await OpenFile.open(videoPath); }
2. 区分前置/后置视频并存储
通过文件名标识或单独变量存储两类视频的路径,方便后续分别打开:
String? frontVideoUri; String? backVideoUri; // 前置录制完成后 frontVideoUri = await saveVideoToMediaStore(tempPath); // 后置录制完成后 backVideoUri = await saveVideoToMediaStore(tempPath); // 打开前置视频 if (frontVideoUri != null) { await OpenFile.open(frontVideoUri); } // 打开后置视频 if (backVideoUri != null) { await OpenFile.open(backVideoUri); }
3. 关键注意事项
- 录制完成后需验证文件是否写入完成,可通过
File(videoPath).exists()判断后再执行打开操作; - Android 11+禁止直接访问外部存储私有路径,必须使用MediaStore返回的Uri或应用私有目录存储。
内容的提问来源于stack exchange,提问作者krupali patel
相关产品推荐
相关产品推荐

