You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:03