使用Xam.Plugin.Media调用相机抛出Field overflow异常的解决咨询
解决Xamarin中CrossMedia.TakePhotoAsync抛出Field Overflow异常的问题
我之前也遇到过类似的异步状态机字段溢出异常,结合社区的解决方案和实践经验,你可以尝试以下几个步骤来修复这个问题:
1. 升级依赖库到兼容的稳定版本
你当前使用的Xamarin.Forms 2.5.0是比较老旧的版本,而Xam.Plugin.Media 3.1.2和这个版本存在明显的兼容性冲突,这是导致该异常的最常见原因。
- 建议将Xamarin.Forms升级到3.6.0.344457及以上的稳定版本(这个版本和多数插件兼容性较好);
- 同时将Xam.Plugin.Media升级到对应的兼容版本,比如4.0.1.6;
- 操作方式:在NuGet包管理器中先卸载当前的两个库,再安装匹配的新版本,确保所有项目(PCL/Shared、Android、iOS)的版本一致。
2. 检查并配置Android项目的必要设置
针对Android平台,需要确认权限和编译架构配置正确:
- 打开Android项目的属性 -> Android Options -> Advanced,确保勾选
armeabi-v7a(至少保留这个架构,其他如arm64-v8a可按需添加),同时将Code shrinker设置为ProGuard或者暂时关闭; - 检查
AndroidManifest.xml中是否添加了相机和存储权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
3. 优化异步方法的实现(推荐)
虽然事件处理方法允许使用async void,但这种写法有时候会导致异步上下文管理异常。可以将拍照逻辑封装为独立的async Task方法:
private async Task TakePhotoAsync() { if (CrossMedia.Current.IsCameraAvailable && CrossMedia.Current.IsTakePhotoSupported) { var mediaOptions = new Plugin.Media.Abstractions.StoreCameraMediaOptions { Directory = "Receipts", Name = $"{DateTime.UtcNow:yyyyMMddHHmmss}.jpg" // 优化文件名格式,避免特殊字符 }; try { var file = await CrossMedia.Current.TakePhotoAsync(mediaOptions); if (file != null) { // 将拍摄的照片显示到Image控件 PhotoImage.Source = ImageSource.FromStream(() => file.GetStream()); // 使用完文件后记得释放资源 file.Dispose(); } } catch (Exception exception) { Console.WriteLine($"拍照异常:{exception.Message}\n{exception.StackTrace}"); throw; } } } private void CameraButton_Clicked(object sender, EventArgs e) { // 调用异步方法,避免async void带来的上下文问题 _ = TakePhotoAsync(); }
4. 清理重建解决方案
旧的编译缓存也可能导致这类奇怪的运行时异常:
- 右键解决方案,选择Clean Solution;
- 删除所有项目下的
bin和obj文件夹; - 最后选择Rebuild Solution,重新运行项目。
异常原因说明
这个Field overflow on store InterpretedSystem.Runtime.CompilerServices.IAsyncStateMachineVT.<>7__wrap2异常,本质是.NET运行时在处理异步状态机时遇到了版本兼容问题,老版本Xamarin.Forms的异步处理逻辑和较新的Media插件不匹配,导致代码生成时出现字段溢出错误。升级到兼容版本后,这类问题通常会被修复。
内容的提问来源于stack exchange,提问作者SilentCoder
相关产品推荐
相关产品推荐

