重复使用Xamarin.Essentials.MediaPicker.CapturePhotoAsync会重启我在And



我需要拍更多的照片,但是Android 11设备上的应用程序重启了。Android 10或更低版本就可以了。它表现得很神秘。有时发生在第三次捕获之后,有时可能发生在第七次捕获之后。

问题的模拟(第二次捕获后重新启动):

  1. 点击按钮拍照
  2. 拍照
  3. 单击OK
  4. 应用程序返回屏幕并带有按钮
  5. 步骤1 - 3
  6. 应用程序重启并显示主界面

如果我在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,问题解决了…

最新更新