Xamarin Community Toolkit CameraView 安卓端访问DCIM文件夹问题
Xamarin Community Toolkit CameraView Android 平台DCIM目录访问解决方案
方案1:优先推荐自定义录制路径
XCT 1.2.0版本的CameraView支持显式指定视频输出路径,直接规避默认路径访问异常问题:
- 录制前先创建可访问的私有存储目录,代码如下:
// 统一使用Xamarin Essentials获取的沙盒目录,跨平台适配性更好 string videoDir = Path.Combine(FileSystem.AppDataDirectory, "RecordedVideos"); if (!Directory.Exists(videoDir)) { Directory.CreateDirectory(videoDir); } string outputPath = Path.Combine(videoDir, $"{DateTime.Now:yyyyMMdd_HHmmss}.mp4"); // 赋值给CameraView的录制路径属性 cameraView.VideoCapturePath = outputPath; // 开始录制 await cameraView.StartCapturingVideoAsync();
- 录制结束后直接从
outputPath读取文件即可,无需额外权限适配。
方案2:访问默认DCIM目录
如果必须使用组件默认的保存路径,按如下步骤操作:
2.1 配置权限
在Android项目的AndroidManifest.xml中添加对应权限:
- 目标版本≤API 29(安卓10):添加
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限,代码运行时动态申请存储权限 - 目标版本≥API 30(安卓11):如果默认路径为公共DCIM目录,需添加
MANAGE_EXTERNAL_STORAGE权限并动态申请;如果为应用私有目录无需额外权限
2.2 枚举私有目录下的所有文件夹
默认Directory.GetDirectories重载可能过滤系统创建的目录,使用全参数重载枚举:
string[] allDirs = Directory.GetDirectories( FileSystem.AppDataDirectory, "*", SearchOption.TopDirectoryOnly);
如果枚举结果仍无DCIM目录,说明默认路径为公共存储目录,需通过MediaStore查询:
// 可通过DependencyService封装调用安卓原生逻辑 var contentResolver = Android.App.Application.Context.ContentResolver; var queryUri = MediaStore.Video.Media.ExternalContentUri; string[] projection = { MediaStore.Video.Media.InterfaceConsts.Data, MediaStore.Video.Media.InterfaceConsts.DisplayName, MediaStore.Video.Media.InterfaceConsts.DateAdded }; var cursor = contentResolver.Query(queryUri, projection, null, null, $"{MediaStore.Video.Media.InterfaceConsts.DateAdded} DESC"); if (cursor.MoveToFirst()) { do { string filePath = cursor.GetString(cursor.GetColumnIndexOrThrow(MediaStore.Video.Media.InterfaceConsts.Data)); // 筛选路径包含DCIM的目标文件 if (filePath.Contains("DCIM")) { // 拿到目标文件路径做后续处理 } } while (cursor.MoveToNext()); } cursor.Close();
内容的提问来源于stack exchange,提问作者Paul Wainwright
相关产品推荐
相关产品推荐

