重复调用Xamarin.Essentials.MediaPicker.CapturePhotoAsync导致Android11应用重启
解决方案
根因说明
这个问题是Android 11及以上系统的两个特性共同导致的:
- Android 11收紧了外部应用调用权限,未正确配置
<queries>节点的应用调用相机后,活动上下文容易丢失 - Android 11优化了后台内存回收策略,调用相机时系统会优先给相机应用分配内存,概率销毁后台的调用方活动,如果你没有处理活动重建逻辑,就会出现应用直接重启回到首页的情况,且无异常抛出
修复步骤
更新依赖包
首先将Xamarin.Essentials升级到1.7.4及以上稳定版,该版本已修复MediaPicker在Android 11上的回调丢失问题。调整AndroidManifest.xml配置
在AndroidManifest.xml的根节点下添加相机调用的查询声明,适配Android 11的包可见性规则:
<queries> <intent> <action android:name="android.media.action.IMAGE_CAPTURE" /> </intent> </queries>
同时确保已声明必要权限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
- 优化活动启动模式与重建逻辑
在MainActivity的Activity特性中设置启动模式为SingleTop,避免每次返回都重建活动:
[Activity(LaunchMode = LaunchMode.SingleTop, ...)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
重写OnSaveInstanceState方法保存当前页面状态,避免活动被销毁后直接回到首页:
protected override void OnSaveInstanceState(Bundle outState) { base.OnSaveInstanceState(outState); // 这里补充保存当前页面导航状态的逻辑 }
- 移除冗余循环逻辑(可选)
你当前的while (LS.IsIntermediateActivity())循环不是必要逻辑,MediaPicker本身已经处理了相机活动的返回判断,移除该循环可以避免异步上下文被意外打断。
验证方式
修改完成后连续执行10次以上拍照流程,如果不再出现重启问题即修复完成。
内容的提问来源于stack exchange,提问作者Martin Nebeský
相关产品推荐
相关产品推荐

