CrossMedia.Current.TakePhotoAsync安卓真机拍照保存后崩溃,模拟器正常
问题排查与解决方案
针对Techno Spark 4 Air(Android 9)真机上使用CrossMedia.Current.TakePhotoAsync拍照确认后崩溃的问题,可按以下步骤排查修复:
1. 修正文件扩展名错误
你的代码中给照片命名用了.mp4扩展名,但TakePhotoAsync生成的是图片文件,错误的扩展名会导致Android系统处理文件时出现异常,这很可能是崩溃的直接原因。修改文件名后缀为.jpg:
await CrossMedia.Current.Initialize(); var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions { PhotoSize = PhotoSize.Medium, Directory = "AAPictures", Name = $"{DateTime.UtcNow:yyyyMMddHHmmss}.jpg" // 修正为图片扩展名,同时优化命名格式避免特殊字符 }); if (file == null) return;
2. 确认权限配置与运行时申请
Android 9对外部存储访问有严格权限要求,确保已配置并申请必要权限:
- 在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> - 在调用拍照前先申请运行时权限:
var statusCamera = await Permissions.CheckStatusAsync<Permissions.Camera>(); var statusStorage = await Permissions.CheckStatusAsync<Permissions.StorageWrite>(); if (statusCamera != PermissionStatus.Granted || statusStorage != PermissionStatus.Granted) { var resultCamera = await Permissions.RequestAsync<Permissions.Camera>(); var resultStorage = await Permissions.RequestAsync<Permissions.StorageWrite>(); if (resultCamera != PermissionStatus.Granted || resultStorage != PermissionStatus.Granted) { // 权限申请失败,提示用户 return; } }
3. 获取原生崩溃日志定位根因
try/catch无法捕获原生层(如JNI)的崩溃,需通过adb logcat抓取系统日志:
- 连接设备到电脑,执行命令:
该命令会输出所有错误级别的日志,找到应用崩溃时的堆栈信息,即可明确具体崩溃原因。adb logcat -d *:E
4. 改用应用私有存储路径
如果外部存储权限问题难以解决,可将照片存储到应用私有目录,无需额外权限:
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions { PhotoSize = PhotoSize.Medium, Directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "AAPictures"), Name = $"{DateTime.UtcNow:yyyyMMddHHmmss}.jpg" });
5. 更新CrossMedia插件版本
确保使用最新版的Xam.Plugin.Media插件,旧版本可能存在Android 9的兼容性Bug,可通过NuGet包管理器更新。
内容的提问来源于stack exchange,提问作者Md Idiake
相关产品推荐
相关产品推荐

