Xamarin Android 11联想平板拍照时出现内存不足错误求助
Android 11下Xam.Plugin.Media拍照触发“内存不足”问题排查与解决
问题概述
- 应用在Android 10运行正常,迁移至Android 11联想平板后,拍照弹出错误提示:
phone available memory is not enough.Temporarily cannot take pictures - 设备实际拥有128GB可用存储空间,仅重启设备能临时解决;清空内存后拍5张就触发错误,已排除图片大小、应用文件残留问题
- 使用
Xam.Plugin.Media组件处理拍照,存储路径为:string folder = Path.Combine("/storage/emulated/0/Android/data", packageName, "files/Pictures/");
解决方案
1. 适配Android 11分区存储规则
Android 11强制推行分区存储,硬编码路径可能导致组件内部资源处理异常。建议改用组件内置的路径管理,避免手动拼接:
var mediaOptions = new StoreCameraMediaOptions { Directory = "Pictures", SaveToAlbum = false, CompressionQuality = 80 }; var file = await CrossMedia.Current.TakePhotoAsync(mediaOptions);
此方式会自动适配系统沙盒存储规范,规避路径权限或内存泄漏风险。
2. 修复组件内存泄漏问题
Android 11对内存管控更严格,旧版本Xam.Plugin.Media可能存在Bitmap或资源句柄未释放的情况:
- 升级组件至最新稳定版,新版本通常已修复Android 11适配漏洞
- 拍照后及时释放资源,使用
using语句自动回收MediaFile对象:
using (var file = await CrossMedia.Current.TakePhotoAsync(mediaOptions)) { if (file == null) return; // 处理照片逻辑 }
3. 适配联想平板系统限制
部分联想Android 11设备对相机进程内存配额限制较严格,可尝试:
- 在
AndroidManifest.xml中声明大内存权限:
<application android:largeHeap="true">
让应用获得更多内存分配,降低相机临时内存占用触发的错误概率
- 关闭平板系统相机的“高清拍照”“RAW格式”等高内存消耗选项
4. 验证内存实际占用情况
若怀疑是组件误判,可在拍照前后添加内存日志确认:
// 拍照前获取内存 var runtime = Java.Lang.Runtime.GetRuntime(); long usedMem = runtime.TotalMemory() - runtime.FreeMemory(); Console.WriteLine($"拍照前已用内存:{usedMem / (1024*1024)} MB"); // 拍照后再次获取 usedMem = runtime.TotalMemory() - runtime.FreeMemory(); Console.WriteLine($"拍照后已用内存:{usedMem / (1024*1024)} MB");
若实际内存占用远低于设备限制,说明是组件错误判断,需考虑升级组件或替换为原生相机实现。
内容的提问来源于stack exchange,提问作者Ins App
相关产品推荐
相关产品推荐

