使用 Android API 30 (Android 11) 通过 Xamarin android 应用程序将文件附加到电子邮件

Attaching a file to email through Xamarin android app with Android API 30 (Android 11)

我有一个 Xamarin android 应用程序,它将日志文件附加到电子邮件。使用 Android 10,这工作正常。但是当我在 Android 11 部手机上尝试此操作时,它在电子邮件应用程序中显示“无法附加文件”。 然后,我看到了这个博客,它解释了 Android 11 中的包可见性,以及需要进行的更改 https://devblogs.microsoft.com/xamarin/android-11-package-visibility/

所以,我通过将其添加到我的清单文件中进行了相应的更改

<queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:scheme="mailto" />
    </intent>
</queries>

我有读写外部存储文件的权限。

下面是我用来附加日志并通过电子邮件发送的代码。

        Intent intent = new Intent(Intent.ActionSend);

        if ((ContextCompat.CheckSelfPermission(ysiCurrentActivity.Current.Activity, Android.Manifest.Permission.ReadExternalStorage) == Android.Content.PM.Permission.Granted) &&
            (ContextCompat.CheckSelfPermission(ysiCurrentActivity.Current.Activity, Android.Manifest.Permission.WriteExternalStorage) == Android.Content.PM.Permission.Granted))
        {
            ysiMainActivity activity = (ysiMainActivity)ysiCurrentActivity.Current.Activity;

            if (activity.GetExternalFilesDir(null) != null && !string.IsNullOrWhiteSpace(activity.GetExternalFilesDir(null).AbsolutePath))
            {
                string sFilePath = Path.Combine(activity.GetExternalFilesDir(null).AbsolutePath, "MobileAppLogs.log");
                if (!File.Exists(sFilePath))
                {
                    FileStream fileStream = new FileStream(sFilePath, FileMode.Create);
                    fileStream.Dispose();
                }
                using (StreamWriter streamWriter = new StreamWriter(sFilePath, false))
                {
                    streamWriter.Write(logs);
                }

                Java.IO.File file = new Java.IO.File(sFilePath);
                file.SetReadable(true, false);
                Android.Net.Uri uri = Android.Net.Uri.FromFile(file);

                intent.SetData(Uri.Parse("mailto:"));
                intent.SetType("message/rfc822");
                intent.PutExtra(Intent.ExtraSubject, "Logs");
                intent.PutExtra(Intent.ExtraStream, uri);

                ysiCurrentActivity.Current.Activity.StartActivity(Intent.CreateChooser(intent, "Send email"));
            }
        }
        else
        {
            return false;
        }

即使添加清单更改后,我仍然无法将日志附加到电子邮件中。 我是不是还漏了什么。

您可以使用 Xamarin.Essentials: Email 来实现。

Email class 使应用程序能够打开带有指定信息(包括主题、正文和收件人)的默认电子邮件应用程序。

当我们检查File Attachments部分时,我们可以发现:

This feature enables an app to email files in email clients on the device. Xamarin.Essentials will automatically detect the file type (MIME) and request the file to be added as an attachment. Every email client is different and may only support specific file extensions, or none at all.

以下是将文本写入磁盘并将其添加为电子邮件附件的示例:

var message = new EmailMessage
{
    Subject = "Hello",
    Body = "World",
};

var fn = "Attachment.txt";
var file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");

message.Attachments.Add(new EmailAttachment(file));

await Email.ComposeAsync(message);

注:

如果您项目的 Target Android 版本设置为 Android 11 (R API 30),您必须使用与新 package visibility requirements.

打开Properties文件夹下的AndroidManifest.xml文件,在manifest节点中添加以下内容:

<queries>
  <intent>
    <action android:name="android.intent.action.SENDTO" />
    <data android:scheme="mailto" />
  </intent>
</queries>

更多详情,请查看:https://docs.microsoft.com/en-us/xamarin/essentials/email?context=xamarin%2Fandroid&tabs=android&WT.mc_id=docs-xamarinblog-jamont