重复使用 Xamarin.Essentials.MediaPicker.CapturePhotoAsync 在 Android 11 上重新启动我的应用程序
Posted
技术标签:
【中文标题】重复使用 Xamarin.Essentials.MediaPicker.CapturePhotoAsync 在 Android 11 上重新启动我的应用程序【英文标题】:repeated use of Xamarin.Essentials.MediaPicker.CapturePhotoAsync restarts my app on Android 11 【发布时间】:2021-11-15 22:00:39 【问题描述】:我需要拍摄更多照片,但应用会在 android 11 设备上重新启动。 Android 10 或更低版本都可以。 它表现得很神秘。有时会在第三次捕获后发生,有时可能在第七次捕获后发生。
模拟问题(第二次捕获后重启):
-
点击按钮拍照
拍照
点击确定
应用通过按钮返回屏幕
步骤 1-3
应用重新启动并显示主屏幕
如果我在var photo = await MediaPicker.CapturePhotoAsync();
上放置一个断点
并转到下一步,什么都不做,应用程序崩溃。
这也发生在App-Essentials Sample App。
编辑: 我的代码:
var file = await MediaPicker.CapturePhotoAsync();
while (LS.IsIntermediateActivity())
await Task.Delay(10);
正常行为:拍摄照片,单击确定,下一步 - while (LS.IsIntermediateActivity()) 然后在 MainActivity OnRestart 和 OnResume。 (LS 是 DependencyService)
不正确的行为:拍摄照片,单击确定,没有下一步 - 应用程序崩溃或重新启动并显示 MainPage。无异常,无警告。
【问题讨论】:
我已经在像素 Android 11.0 上进行了测试。我无法重现应用程序 scrshes。我只检查了代码:var photo = await MediaPicker.CapturePhotoAsync();
我错过了什么吗?
您一定遇到了异常。弄清楚它是什么,然后从那里开始。也许您没有为图像释放一些内存并且内存不足?需要更多信息!
我们目前在 ios 14.7.1 上遇到了与 Essentials 1.7 非常相似的错误。使用相同的 await MediaPicker.CapturePhotoAsync();当单击调用中的实际照片按钮时,应用程序偶尔会崩溃并引发异常,该异常会关闭应用程序并且不会被 try/catch 捕获。我们在 AppCenter -> SIGABRT:Objective-C 异常抛出中看到了这一点。名称:NSGenericException 原因:*** 集合 <__nsarraym:> 在枚举时发生了变异。
如果可能的话,你能分享你的代码和一些异常细节吗?
没有例外。这就是问题所在。
【参考方案1】:
我记得我的一位同事遇到了一个非常相似的问题,而这个关于媒体选择器的注释实际上解决了他们的问题
必须在 UI 线程上调用所有方法,因为权限检查和请求由 Xamarin.Essentials 自动处理。
这很奇怪,因为他们自己的例子没有这样做:/
无论如何试试这个,看看这是否能解决你的问题:
var fileResult= await Device.InvokeOnMainThreadAsync(async () => await MediaPicker.CapturePhotoAsync());
祝你好运
如果您有任何疑问,请随时回复。
【讨论】:
经过测试,没有帮助。【参考方案2】:我尝试了另一种解决方案:
public async Task<string> TakePhotoAsync()
waitForResult = new AsyncAutoResetEvent();
var context = Android.App.Application.Context;
var activity = Xamarin.Essentials.Platform.CurrentActivity as MainActivity;
using (var intent = new Intent(MediaStore.ActionImageCapture))
string timestamp = System.DateTime.Now.ToString("yyyyMMdd_HHmmss");
var file = new File(GetPictureDirPath(), "EMAphoto_" + timestamp + ".jpg");
var uri = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".fileprovider", file);
intent.PutExtra(MediaStore.ExtraOutput, uri);
activity.StartActivityForResult(intent, CAMERA_REQUEST_CODE);
await waitForResult.WaitAsync().ConfigureAwait(true);
return file.Path;
它也崩溃了...... 是愚蠢的 Android 11 还是我?
【讨论】:
【参考方案3】:我研究了这个问题。 基本上,当从您的应用程序中使用媒体选择器打开相机时,您的应用程序会被 Android 置于后台,因为现在正在使用相机应用程序。一些 RAM 优化发生并且操作系统可能会重新启动您的应用程序。在测试中,我们使用 3Gb RAM 的设备没有问题,但使用 2Gb RAM 设备时遇到了这个问题。很可能是因为内存不足。
解决方案是在离开应用时保存应用状态,并在拍照回来后重新使用该状态,以防应用重新启动。我们还没有找到一个简单的解决方案,非常欢迎提出想法......
【讨论】:
以上是关于重复使用 Xamarin.Essentials.MediaPicker.CapturePhotoAsync 在 Android 11 上重新启动我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章