如何在Xamarin Forms应用程序中设置列出目录的权限

问题描述

任何人都可以帮助解释Xamarin表单应用程序中的以下行为吗?

在我的MainActivity.cs文件中,如果我调用以下函数

string szPicturesDirectory = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;

我得到:

“ /存储/模拟/ 0 /图片

好的,很好。如果我现在打电话:

var dirs = Directory.EnumerateDirectories("/storage/");
List<string> workdirs = new List<string>(dirs);

我得到:

enter image description here

也可以。

但是如果我打电话给我,

var dirs = Directory.EnumerateDirectories(szPicturesDirectory);

我得到:

enter image description here

添加

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到我的AndroidManifest.xml文件,但仍然是相同的错误。整个文件是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.oglmobile">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="OGLMobile.Android" android:theme="@style/MainTheme"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

感谢您的帮助, 米奇。

解决方法

如果Android 6 (API 23)或更高版本,则在应用程序运行期间在运行时请求许可。

尝试请求WriteExternalStorage运行时权限。

在您的MainActivity中:

protected override void OnCreate(Bundle savedInstanceState)
    {
       ...
      if (CheckSelfPermission( Manifest.Permission.WriteExternalStorage) == Permission.Granted)
      {
         string szPicturesDirectory = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;
         var dirs = Directory.EnumerateDirectories(szPicturesDirectory);
         List<string> workDirs = new List<string>(dirs);
      }
      else
      {
         ActivityCompat.RequestPermissions(Instance,new string[] { Manifest.Permission.WriteExternalStorage },1);
      }
     ...
    }

 public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);

        base.OnRequestPermissionsResult(requestCode,grantResults);
        if (requestCode == 1)
        {
            if (grantResults[0] == Permission.Granted)
            {
                string szPicturesDirectory = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;
                var dirs = Directory.EnumerateDirectories(szPicturesDirectory);
                List<string> workDirs = new List<string>(dirs);
            }
        }
    }