毛伊岛 - Net 8 => 文件选择器选择取消会使应用程序崩溃。致命信号 6 (SIGABRT),代码 -1 或致命信号 11 (SIGSEGV),代码 2 (SEGV_ACCERR)

问题描述 投票:0回答:1

我使用 maui 来实现不太复杂的 Android 应用程序。使用 .net 8 和调试设备,我使用运行 APK 29 的华为设备以及运行 APK 34 的三星 Flip。

另外我应该提到,我正在使用 mvvm 模式,并且我使用的工具是社区工具包。

  • 问题:

当您使用 Filepicker 选择文件时(使用 Filepicker.Default.PickAsync() 静态方法或使用构造函数中的请求作为服务。 这就是我注入服务的方式:

//已编辑。过渡到单例

builder.Services.AddSingleton<IFilePicker>((e) => FilePicker.Default); 

当我尝试选择文件时,一切都会按预期进行。但是,当您取消选择文件过程并返回到应用程序时,应用程序毫无例外地崩溃了,没有任何反应。我看到错误为致命信号 6 (SIGABRT)、代码 -1 或致命信号 11 (SIGSEGV)、代码 2 (SEGV_ACCERR)。我已经搜索了这些错误,这些错误表明存在某种地址问题。

我分享了vs 2022的输出信息以及发生错误时华为手机的logcat。 我将日志的错误部分设置为粗体。我希望这是可以理解的。

我尝试了什么来解决问题或找到错误原因:

  • 我尝试绕过 mvvm 模式,并使用静态方法或注入服务在按钮的单击事件中调用
    filepicker.pickasync()
    。没有运气。
  • 在几个不同的页面上尝试第一种方法,以防导航出现问题。不!!
  • 我尝试使用 mediapicker 而不是 filepicker 来查看文件选择器是否有问题。没有! Mediapicker 也会导致同样的问题。
  • 但是,如果我创建新的 maui 项目并使用文件选择器或媒体选择器作为静态方法或在单击事件和 mvvm 模式命令后面的代码上注入服务,则没有问题。完美运作。

看来问题出在我的项目中。但问题是什么或者是什么原因导致了问题我无法弄清楚。

你觉得怎么样?

PS:对不起我的英语。

编辑:我如何调用文件选择器

[RelayCommand]
private async Task OpenFile()
{
    try 
    {
        var result = await openFile.PickAsync(new PickOptions
        {
            PickerTitle = localization.GetLocalizationKeyValue("KmlKmzFilePickerTitle"),
            FileTypes = new FilePickerFileType(new Dictionary<DevicePlatform, IEnumerable<string>>
            {
                {DevicePlatform.Android, new []{ "application/vnd.google-earth.kml+xml", "application/vnd.google-earth.kmz", "text/plain" } }
            })
        });  
    }
    catch (Exception e)
    {
        throw e;
    }
}

编辑: 我尝试在 UI 上运行。同样的问题。还使用

MainThread.IsMainThread
检查代码是否在主线程上运行。是的,代码位于主线程上,我也设置了断点,应用程序永远不会退出
openFile.PickAsync()
方法。它甚至没有击中捕获块。在
openFile.PickAsync()
方法中,应用程序崩溃并给出以下几行输出:

[m.andromeda.gi] 显式并发复制 GC 已释放 19037(1444KB) AllocSpace 对象,0(0B) 个 LOS 对象,38% 可用,37MB/61MB,已暂停 151us 总计 110.722ms []

断言位于 /__w/1/s/src/mono/mono/mini/interp/interp.c:2106, 条件 `context->stack_pointer context-stack_end' 不满足

[libc] 致命信号 6 (SIGABRT),代码 -1 (SI_QUEUE),位于 tid 26407 (m.andromeda.gis)、pid 26407 (m.andromeda.gis)

c# android maui logcat .net-8.0
1个回答
0
投票

这是预期行为,如文档和教程中提到的那样。您需要将 PickAsync() 调用包装在 try Catch 块中。

   try
   {
     await Filepicker.PickAysnc()
   }
   catch(Exception ex)
   {
     //Do stuff if user cancels picker
   }
© www.soinside.com 2019 - 2024. All rights reserved.