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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:17