我正在尝试下载文件而我收到System.UnauthorizedAccessException:访问路径" /storage/emulated/0/Download/test.pdf"被拒绝。我在Android清单文件中设置了所需的权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下载路径:
Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads)
如果我使用以下路径作为我的下载路径,我可以下载该文件。但我无法将PDF文件分享到谷歌驱动器,丢弃框或任何其他System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
我使用的是Xamarin.Forms v2.4.0.282和Xamarin.Android.Support软件包v25.4.0.2。
注意:使用Xamarin.Forms版本2.3.5.256-pre2和Xamarin.Android.Support软件包v23.3.0时代码正常 请提出您的想法以解决问题。
先谢谢。
答案 0 :(得分:15)
根据您使用的Android版本,即使在6.0或更高版本的清单中添加了权限,用户也必须在应用运行时明确启用权限,在安装期间要求提供较低版本的权限。例如,在启动应用程序时,我创建了一个方法来检查它是否已启用,如果不是则请求权限。
private void CheckAppPermissions()
{
if ((int)Build.VERSION.SdkInt < 23)
{
return;
}
else
{
if (PackageManager.CheckPermission(Manifest.Permission.ReadExternalStorage, PackageName) != Permission.Granted
&& PackageManager.CheckPermission(Manifest.Permission.WriteExternalStorage, PackageName) != Permission.Granted)
{
var permissions = new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage };
RequestPermissions(permissions, 1);
}
}
}
您也可以使用支持库来执行此操作,这样更简单,并且您无需检查Android版本。有关详细信息,请查看google's documentation.
答案 1 :(得分:6)
如果定位到API 29+,即使您请求权限并由用户授予权限,您也会收到错误消息,因为它们更改了存储的工作方式。
正确的解决方案是看应该如何在API 29+上完成它并做到。
但是,如果您像我一样,已经厌倦了Android使事情变得越来越复杂,只需将android:requestLegacyExternalStorage="true"
添加到清单<application>
标记中,您便会保存下来,直到开始定位API 30。
答案 2 :(得分:3)
在您的应用程序是Targeting API29或更高版本之后遇到此问题的人,请转到此链接并查看LandLu的答案:
https://forums.xamarin.com/discussion/171039/saving-files-to-external-storage
我之前使用来访问文件夹路径 返回Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; 但是使用此行解决了我的问题: 返回Android.App.Application.Context.GetExternalFilesDir(“”)。AbsolutePath;
答案 3 :(得分:0)
如果您运行的是Android api级别23或更高版本,即使您已在清单文件中提及它们,也需要用户在运行时的权限。检查并且用户是否尚未授予READ_EXTERNAL_STORAGE
&amp; WRITE_EXTERNAL_STORAGE
,请使用以下代码;
var permissions = new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage };
RequestPermissions(permissions, 77);
如果我使用以下路径作为我的下载路径,我可以下载 文件。但我无法将PDF文件分享到谷歌驱动器,丢弃框 或任何其他 System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
您将文件存储在应用的私人存储空间中。保存到内部存储的所有文件都是您的应用程序专用的,而其他应用程序(谷歌驱动器,投递箱或任何其他应用程序)无法访问它们(用户也无法访问)。您可以使用任何公用文件夹来实现此目的;
var finalPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
答案 4 :(得分:0)
替换
Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
与
Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath;