Xamarin Android应用在Android11(API30)下邮件附件无法加载问题求助
问题根因
你遇到的问题核心是Android 11对跨应用文件访问的权限限制收紧,你当前使用Uri.FromFile()生成的file://格式URI,第三方邮件应用没有权限直接读取,所以会提示无法附加文件,和你配置的包可见性规则无关。
修复步骤
1. 配置FileProvider
首先在AndroidManifest.xml的<application>节点下添加FileProvider声明:
<provider android:name="androidx.core.content.FileProvider" android:authorities="你的应用包名.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
注意把你的应用包名替换为你APP实际的包名(比如com.yourcompany.yourapp)。
提示:如果编译时找不到FileProvider类,请先通过NuGet安装
Xamarin.AndroidX.Core依赖包。
2. 新增共享路径配置
在你的Xamarin Android项目的Resources/xml目录下(如果没有xml文件夹就新建一个),创建file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 对应你代码中用到的GetExternalFilesDir目录 --> <external-files-path name="external_app_files" path="." /> </paths>
这个配置的作用是向FileProvider声明,你允许共享应用专属外部存储目录下的所有文件。
3. 修改附件URI生成逻辑
把你代码中生成URI的部分替换为FileProvider的API,同时给Intent授予读取权限:
// 注释掉原来的file URI生成逻辑 // Android.Net.Uri uri = Android.Net.Uri.FromFile(file); // 替换为FileProvider生成content URI Android.Net.Uri uri = FileProvider.GetUriForFile( ysiCurrentActivity.Current.Activity, "你的应用包名.fileprovider", // 和Manifest里配置的authorities完全一致 file ); intent.SetType("message/rfc822"); intent.PutExtra(Intent.ExtraSubject, "Logs"); intent.PutExtra(Intent.ExtraStream, uri); // 关键:给目标邮件应用授予URI的读取权限 intent.AddFlags(ActivityFlags.GrantReadUriPermission); ysiCurrentActivity.Current.Activity.StartActivity(Intent.CreateChooser(intent, "Send email"));
额外优化建议
你代码中用到的GetExternalFilesDir是应用专属的外部存储目录,从Android 4.4开始访问这个目录不需要申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,如果你没有其他需要访问公共存储的逻辑,可以直接去掉这两个权限的申请和校验逻辑,减少权限申请带来的用户困扰。
内容的提问来源于stack exchange,提问作者Marcus25
相关产品推荐
相关产品推荐

