我使用 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。 我将日志的错误部分设置为粗体。我希望这是可以理解的。
我尝试了什么来解决问题或找到错误原因:
filepicker.pickasync()
。没有运气。看来问题出在我的项目中。但问题是什么或者是什么原因导致了问题我无法弄清楚。
你觉得怎么样?
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)
这是预期行为,如文档和教程中提到的那样。您需要将 PickAsync() 调用包装在 try Catch 块中。
try
{
await Filepicker.PickAysnc()
}
catch(Exception ex)
{
//Do stuff if user cancels picker
}