重复使用Xamarin.Essentials.MediaPicker.CapturePhotoAsync在Android 11上重新启动我的应用程序

brtdzjyr  于 2022-12-07  发布在  Android
关注(0)|答案(4)|浏览(140)

我需要拍更多的照片,但应用程序在Android 11设备上重新启动。Android 10或更低版本是可以的。它的行为神秘莫测。有时它发生在第三次捕捉后,有时可能在第七次捕捉后。
问题模拟(第二次捕获后重启):
1.单击按钮拍照
1.拍照
1.单击确定
1.应用程序返回到带有按钮的屏幕
1.步骤1 - 3
1.应用程序重启并显示主屏幕
如果我在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是依赖关系服务)
不正确的行为:捕获照片,单击确定,无下一步-应用程序崩溃或重新启动并显示主页。无异常,无警告。

yyhrrdl8

yyhrrdl81#

我记得我的一个同事遇到了一个非常类似的问题,媒体选择器上的这条注解实际上解决了他们的问题
所有方法都必须在UI线程上调用,因为权限检查和请求由Xamarin. Essentials自动处理。
这很奇怪,因为他们自己的例子并没有这样做:/
无论如何,试试这个,看看它是否能解决你的问题:

var fileResult= await Device.InvokeOnMainThreadAsync(async () => await MediaPicker.CapturePhotoAsync());

古德勒克
如果您有疑问,请随时返回。

1u4esq0p

1u4esq0p2#

我研究了这个问题。基本上,当从你的应用程序中打开带有媒体选择器的相机时,你的应用程序会被Android置于后台,因为相机应用程序现在正在使用。一些RAM优化发生,操作系统可能会重新启动你的应用程序。在测试中,我们在3GB RAM的设备上没有问题,但在2GB RAM的设备上遇到了这个问题。很可能是因为RAM不够。
一个解决方案是在离开应用程序时保存应用程序状态,并在拍照后重新使用,以防应用程序重新启动。我们还没有找到一个简单的解决方案,非常欢迎提出想法。

l7wslrjt

l7wslrjt3#

我尝试了另一种解决方案:

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还是我?

z18hc3ub

z18hc3ub4#

更新到Android 12和问题解决...

相关问题