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

puruo6ea  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(103)

我正在尝试下载一个文件,我得到系统.未经授权的异常:访问路径“/storage/emulated/0/Download/test.pdf”被拒绝.我已经在Android Manifest文件中设置了所需的权限.

<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 packages v25.4.0.2。

**注意:**当使用Xamarin.Forms version 2.3.5.256-pre 2和Xamarin.Android.Support packages v23.3.0时,代码运行正常,请提出您的想法来解决问题。

提前致谢。

nxagd54h

nxagd54h1#

根据您使用的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版本。

8wigbo56

8wigbo562#

如果目标是API 29+,即使您请求权限并且用户赠款权限,您也会收到错误,因为它们更改了存储的工作方式。
正确的解决方案是看看它应该如何在API 29+上完成,然后去做。
但是如果你和我一样,厌倦了Android每天都在让事情变得更加复杂,那么只需将android:requestLegacyExternalStorage="true"添加到清单<application>标记中,然后就可以一直保存到你开始瞄准API 30。

lvjbypge

lvjbypge3#

如果您的应用程序是针对API 29或更高版本的,您将面临此问题,请转到此链接并查看LandLu的回答:
https://forums.xamarin.com/discussion/171039/saving-files-to-external-storage
之前我使用 return Android.OS.Environment. ExternalFilesDirectory.AbsolutePath; 访问文件夹路径,但使用这一行解决了我的问题:return Android.App.Application.Context.GetExternalFilesDir(“”).AbsolutePath;
这是正确的答案!

nfeuvbwi

nfeuvbwi4#

如果您运行的是Android API级别23或更高版本,您需要用户对运行时的权限,即使您在清单文件中提到了它们。检查,如果用户尚未授予授予READ_EXTERNAL_STORAGE & WRITE_EXTERNAL_STORAGE,请使用以下代码;

var permissions = new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage };
            RequestPermissions(permissions, 77);

字符串
如果我使用下面的路径作为我的下载路径,我可以下载文件。但我不能共享PDF文件到谷歌驱动器,下拉框或任何其他系统。环境。GetFolderPath(系统。环境。特殊文件夹。个人)
您正在将文件存储在应用程序的私人存储上。保存到内部存储的所有文件都是您的应用程序的私人文件,其他应用程序(Google Drive,Drop Box或任何其他)无法访问它们(用户也不能)。您可以为此使用任何公共文件夹;

var finalPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);

piv4azn7

piv4azn75#

取代

Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;

字符串

Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath;

相关问题