Xamarin-System.UnauthorizedAccessException:拒绝访问路径

时间:2017-10-24 13:10:45

标签: xamarin xamarin.android

我正在尝试下载文件而我收到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时代码正常 请提出您的想法以解决问题。

先谢谢。

5 个答案:

答案 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;