我需要拍更多的照片,但是Android 11设备上的应用程序重启了。Android 10或更低版本就可以了。它表现得很神秘。有时发生在第三次捕获之后,有时可能发生在第七次捕获之后。
问题的模拟(第二次捕获后重新启动):
- 点击按钮拍照
- 拍照
- 单击OK
- 应用程序返回屏幕并带有按钮
- 步骤1 - 3
- 应用程序重启并显示主界面
如果我在var photo = await MediaPicker.CapturePhotoAsync();
上放置一个断点然后进入下一步,什么都没做,应用程序崩溃了。
这也发生在App- essentials示例应用程序中。
编辑:我的代码:
var file = await MediaPicker.CapturePhotoAsync();
while (LS.IsIntermediateActivity())
{ await Task.Delay(10); }
正常行为:捕获照片,点击确定,下一步-而(LS.IsIntermediateActivity()),然后在MainActivity OnRestart和OnResume。(LS是DependencyService)
不正确的行为:捕获照片,单击确定,没有下一步-应用程序崩溃或重新启动并显示主页。No Exception, No warning.
我记得我的一个同事遇到了一个非常类似的问题,这篇关于媒体选择器的注释实际上解决了他们的问题
所有的方法都必须在UI线程上调用,因为权限检查和请求是由Xamarin.Essentials自动处理的。
这很奇怪,因为他们自己的例子并没有这样做:/
无论如何,试试这个,看看这是否解决了你的问题:
var fileResult= await Device.InvokeOnMainThreadAsync(async () => await MediaPicker.CapturePhotoAsync());
古德勒克
如果您有任何疑问,请随时回复。
我调查了这个问题。基本上,当你在应用中使用Media Picker打开相机时,你的应用会被Android放在后台,因为相机应用现在正在使用。在测试中,我们在使用3Gb RAM的设备时没有问题,但在使用2Gb RAM的设备时就遇到了这个问题。很可能是因为内存不足。
一个解决方案是在离开你的应用程序时保存你的应用程序状态,并在拍照回来后重用它,以防你的应用程序重新启动。我们还没有找到一个简单的解决方案,欢迎大家出主意。
我尝试了另一个解决方案:
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还是我?
升级到Android 12,问题解决了…