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

Android 11(API 30)下使用Xamarin Essentials拍照并保存到设备问题咨询

问题解答

可以在Android 11(API 30)环境下使用Xamarin Essentials完成拍照并保存到本地设备的需求,你当前遇到的照片无法找到的问题由两个原因导致:

  • 存储路径选择了应用私有目录System.Environment.SpecialFolder.Personal,该目录下的文件仅应用自身可访问,系统相册、用户文件管理器默认无法读取,并非没有成功写入
  • 文件流写入使用了同步方法、没有正确释放流,可能偶现写入不完整的问题

修复方案

1. 代码逻辑修改

将存储路径修改为系统公共图片目录,同时优化流写入的异步逻辑,修改后的代码如下:

private async void TakePhoto()
{
    try
    {
        Console.WriteLine("Camera started");
        string fN = "RI-" + Asset_ID.Text + lblUniqueName.Text + ".jpg";
        var file = await MediaPicker.CapturePhotoAsync();
        if (file == null)
            return;

        // 预读照片流到内存,避免多次打开产生异常
        using var photoStream = await file.OpenReadAsync();
        using var memoryStream = new MemoryStream();
        await photoStream.CopyToAsync(memoryStream);
        memoryStream.Position = 0;

        // 构造上传请求内容
        var content = new MultipartFormDataContent();
        content.Add(new StreamContent(memoryStream), "file", fN);

        // 替换为系统公共图片目录,写入的文件对用户可见
        string directory = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;
        string filePath = Path.Combine(directory, fN);
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }

        // 异步写入本地文件
        using var outputStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
        memoryStream.Position = 0;
        await memoryStream.CopyToAsync(outputStream);
        await DisplayAlert("提示", "照片已保存到本地", "OK");

        // 原有云端上传逻辑保持不变
        var httpClient = new HttpClient();
        var response = await httpClient.PostAsync("https://tasmanoperationsportal.azurewebsites.net/UploadFile", content);
        Console.WriteLine("App Returned");
        await DisplayAlert("成功", "照片已上传到云端", "OK");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        await DisplayAlert("失败", "无网络连接,请使用系统相机拍摄后稍后上传", "OK");
    }
}

2. 配置与权限说明

你当前的AndroidManifest.xml配置已经满足API 30的权限要求,不需要额外修改。如果后续升级targetSdk到33及以上,需要补充以下权限声明:

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

调用拍照方法前,建议先通过Xamarin Essentials的Permissions类动态申请相机和存储权限,避免权限被拒导致功能异常。

内容的提问来源于stack exchange,提问作者Tricky035

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:45:05