将文件放在可以附加到 Xamarin 中针对 Android API 29 的电子邮件的某个位置

问题描述

支持用 Xamarin 编写的 Android 应用程序,该应用程序具有用户可以通过电子邮件将日志和 sqlite db 文件发送到支持电子邮件地址的功能。它通过压缩文件,然后将 ZIP 复制到公共下载文件夹,然后将它们附加到电子邮件中来完成此操作。 它使用下载文件夹,以便其他应用程序有权访问这些文件,如果我使用 USB 电缆连接到我的电脑,我就可以看到它们。

到目前为止,这一直工作正常 - 要将更新部署到 Play 商店,我现在必须以 API 29 为目标,但这不再有效。将 ZIP 文件移动到下载文件夹的功能失败。

我使用以下方法获取下载文件夹中新文件的路径:

var path = Path.Combine(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath,filepath);

尽管 VS 将此方法显示过时:“已弃用”

当我尝试将 ZIP 文件移动到它时,我得到

System.UnauthorizedAccessException:拒绝访问路径“/storage/emulated/0/Download/logs.zip”。

我已添加

android:requestLegacyExternalStorage="true"

到我的清单,这根本没有区别。

如果我切换回面向 API 28,一切正常。

是否有任何地方可以放置文件以允许用户认电子邮件应用程序将其作为附件阅读?

解决方法

如果您已请求读取和写入运行时权限。检查建议是下面的链接。 Android 9.+ API 29: /storage/emulated/0/Pictures/myPic.png open failed: EACCES (Permission Denied)

并使用下面的代码替换已弃用的方法。

var path = Path.Combine(GetExternalFilesDir(Android.OS.Environment.DirectoryDownloads).AbsolutePath,filepath);