首页 > 解决方案 > 如何设置权限以在 Xamarin 表单应用程序中列出目录

问题描述

任何人都可以帮助解释 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);

我得到:

在此处输入图像描述

那也很好。

但如果我打电话给:

var dirs = Directory.EnumerateDirectories(szPicturesDirectory);

我得到:

在此处输入图像描述

我添加了

<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>

谢谢你的帮助,米奇。

标签: c#androidxamarin

解决方案


如果是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, permissions, 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);
            }
        }
    }

推荐阅读