如何处理 Android 13 似乎已经损坏的 Xamarin.Essentials?

How to deal with Xamarin.Essentials which Android 13 seems to have broken?

提问人:jaakko 提问时间:12/21/2022 更新时间:6/12/2023 访问量:858

问:

我想将按下 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");

我的环境非常脆弱,这就是为什么我通常非常犹豫是否要尝试更新任何内容

C# Android 电子邮件 崩溃 Xamarin.Essentials

评论


答:

0赞 Michele Bellin 6/11/2023 #1

我遇到了您描述的相同问题(仅限于 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>