c# - 如何设置权限以在 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>
谢谢你的帮助,米奇。
解决方案
如果是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);
}
}
}
推荐阅读
- css - 如何在 prestashop 中添加自定义字体?
- javascript - 为什么滚动条有时会出现,有时却不在 chrome 扩展中
- python - 使用熊猫在多张工作簿中删除特定列
- android - 您的 Android App Bundle 使用错误的密钥进行签名。确保您的 app bundle 使用正确的签名密钥进行签名,然后重试
- ruby - 查看在 COSMOS 中发送的原始字节
- actions-on-google - 如何在 Beta 测试中使用 Google Home 设备进行调试?
- bash - 如何更改各个文件夹中特定文件的名称
- r - R - 将具有重复日期的名称组合成单行
- spring-boot - RestController 在 SpringBoot 中工作正常,但在 Tomcat 上抛出 404
- mysql - 如何将 MySQL JSON 数组中的字符串值转换为大写?