重复使用 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 上重新启动我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用LINQ去除重复项。

使用熊猫重复加载 csv [重复]

使用 ASP 重复器创建 HTML 表,水平重复

ORACLE中,如何使用UPDATE修改重复列

Android中 使用AOP避免重复点击事件

PostgreSQL 如何查找并删除重复数据