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
相关产品推荐
相关产品推荐

