提问人:jaakko 提问时间:12/21/2022 更新时间:6/12/2023 访问量:858
如何处理 Android 13 似乎已经损坏的 Xamarin.Essentials?
How to deal with Xamarin.Essentials which Android 13 seems to have broken?
问:
我想将按下 Uno 平台 (Xamarin) Android 移动应用中按钮的用户发送到预填充的电子邮件,并将正文和主题作为参数传递,以便自动执行发送报告的过程。
该应用使用 MVVM 模式,视图中的按钮绑定到 ViewModel 中的命令,该命令将一些字符串放在一起,并尝试将它们与用户一起发送到他们选择的电子邮件应用。没有什么特别复杂的。
从 Android 13 开始,以下代码段导致应用程序持续崩溃(之前没有这样做)
var message = new Xamarin.Essentials.EmailMessage
{
Subject = Report.SUBJECT,
Body = Report.DATA
To = new List<string> { Report.RECIPIENT }, // "[email protected]"
};
await Xamarin.Essentials.Email.ComposeAsync(message);
堆栈跟踪产生以下内容
ApplicationActivity+<>c__DisplayClass29_0.<SetContentView>b__0 (System.Object s, Android.Views.View+ViewAttachedToWindowEventArgs e)
System.NullReferenceException: Object reference not set to an instance of an object
这很奇怪。该消息不为 null(在调试器中显示)。此外,尽管应用程序崩溃,但消息本身会在所选电子邮件应用程序中正确生成(如果我在应用程序崩溃后手动导航到那里,那就是)
该应用的最低 Android 版本为 Android 9(API 级别 28),目标是 11(API 30)。 最新的 .NET Core SDK 是 6.0.101,.NET Core 运行时是 6.0.1,如 SDK 管理器所示。 我在 Visual Studio 2019 for Mac 社区版版本 8.10.22(内部版本 11)中工作
我该如何处理?
到目前为止,我尝试过:
将 ComposeAsync 替换为 Launcher.OpenAsync 会导致相同的失败。
var uri = $"mailto:{Report.RECIPIENT}?subject={Report.SUBJECT}&body={Report.DATA}";
await Xamarin.Essentials.Launcher.OpenAsync(uri);
事实上,即使只是去一些示例网站,结果也会以同样的方式崩溃
var uri = "https://example.com";
await Xamarin.Essentials.Launcher.OpenAsync(uri);
将整个方法(无论启动器或电子邮件如何)包装在 try-catch 语句中都无法捕获任何内容,并且应用程序仍然崩溃
private async void SendReport()
{
try
{
// Do the thing
}
catch (Exception ex)
{
// Some exception occurred
}
}
令人惊讶的是,在应用的其他位置,使用 View 中的超链接按钮(而不是 ViewModel 方法)确实可以正常工作
<HyperlinkButton
NavigateUri="mailto:[email protected]">
<TextBlock Text="Contact via e-mail"/>
</HyperlinkButton>
这表明 Xamarin.Essentials 对我不起作用,而不仅仅是 Android 中的电子邮件。
我更愿意在 ViewModel 的 SendReport 方法中解决问题,而不是诉诸程序员讨厌的一个奇怪的技巧(在 UI 中切换到超链接按钮)来使其工作。
有关所有应用的 Android 13 行为更改的文档似乎不包含与此问题明显相关的任何更改。
相比之下,iOS这次运行良好
这种绝望的尝试并没有开箱即用。
System.Diagnostics.Process.Start("http://www.c-sharpcorner.com/Default.aspx");
我的环境非常脆弱,这就是为什么我通常非常犹豫是否要尝试更新任何内容
答:
我遇到了您描述的相同问题(仅限于 Android 13),只有一个区别:使用 try-catch 语句我捕获了一个错误:
{Xamarin.Essentials.FeatureNotSupportedException:指定的方法为 不支持。在 Xamarin.Essentials.Email.ComposeAsync Xamarin.Essentials.EmailMessage 消息) [0x00007] in D:\a_work\1\s\Xamarin.Essentials\Email\Email.shared.cs:19 在 .... }
我确实通过在AndroidManifest .xml中添加以下部分来解决它:
<queries>
<intent>
<action android:name="android.intent.action.SENDTO" />
<data android:scheme="mailto" />
</intent>
</queries>
评论