c# - Xamarin.Android 应用程序不请求“WriteExternalStorage”(但代码与“ReadExternalStorage”一起工作正常)
问题描述
我已经有一些使用 C# 的经验,但是我是 Android 开发的新手,想从一个简单的项目应用程序开始,它可以在外部存储上创建一个带有文件的新目录(“/storage/emulated/0/” [Android.OS.Environment.ExternalStorageDirectory.AbsolutePath])并阅读它。
在文档中,我读到在较新的 SDK 中,仅提及 AndroidManifest.xml 中的权限(在本例中为“ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE”)是不够的。所以我添加了一个在运行时请求它们的方法。
我的问题是,如果我请求“Manifest.Permission.WriteExternalStorage”,模拟器 [Android 8.1 API 27](以及我的带有 USB 调试功能的手机 [Android 8.0])不会打开权限对话框。如果我使用我的代码请求“Manifest.Permission.ReadExternalStorage”,则会出现对话框,您可以接受和拒绝,并且该操作在设置中可见。
首先,我尝试将自己的代码写入文档(https://docs.microsoft.com/de-de/xamarin/android/platform/files/external-storage),但不会打开对话框。我试图让 NuGet-Package (Karamunting.Android.PermissionManager) 管理请求,同样的问题:它只是要求读取权限,而不是写入权限。现在我正在使用从 GitHub 项目 ( https://github.com/xamarin/monodroid-samples/tree/master/LocalFiles ) 复制的代码,但仍然是同样的问题。
这是应该请求权限的方法
const int RC_WRITE_EXTERNAL_STORAGE_PERMISSION = 1000;
static readonly string[] PERMISSIONS_TO_REQUEST = { Manifest.Permission.WriteExternalStorage };
bool RequestExternalStoragePermissionIfNecessary(int requestCode)
{
if (Android.OS.Environment.MediaMounted.Equals(Android.OS.Environment.ExternalStorageState))
{
if (CheckSelfPermission(Manifest.Permission.WriteExternalStorage) == Permission.Granted)
{
Log.Debug(TAG, "Neccessary permissions granted");
return false;
}
Log.Debug(TAG, "Permissions denied --> requesting");
if (ShouldShowRequestPermissionRationale(Manifest.Permission.WriteExternalStorage))
{
Snackbar.Make(FindViewById(Android.Resource.Id.Content),
Resource.String.write_external_permissions_rationale,
Snackbar.LengthIndefinite)
.SetAction(Resource.String.ok, delegate { RequestPermissions(PERMISSIONS_TO_REQUEST, requestCode); });
}
else
{
RequestPermissions(PERMISSIONS_TO_REQUEST, requestCode);
}
return true;
}
Log.Warn(TAG, "External storage is not mounted; cannot request permission");
return true;
}
它在按钮单击时调用,但我也尝试在 OnCreate() 方法中使用它
bool useIntern = RequestExternalStoragePermissionIfNecessary(RC_WRITE_EXTERNAL_STORAGE_PERMISSION);
我还提到了 AndroidManifest 中的权限
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="27" />
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE" />
如果授予权限,我希望应用程序将检查启动/按钮单击(它确实检查权限并在控制台中写入“权限被拒绝-> 请求”)。
但在那之后,应用程序应显示对话框“允许应用程序在您的设备上 [...]? - 拒绝 - 允许”。如果我请求写入权限,则不会发生这种情况,但如果我请求读取,则会发生这种情况。
感谢您提前提供任何帮助
菲尔
解决方案
似乎问题不在于代码,而在于配置。
在 AndroidManifest.xml 中,我将 minSdk 从 23 更改为 21 以及权限的大写:
<?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.testapp" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"></application>
</manifest>
感谢您的帮助@LeoZhu-MSFT
推荐阅读
- r - 根据 Shiny R 中的单选按钮选择过滤列
- html - 如何传递图像下的文本,其中两列在引导程序上定义为图像,另一列用于文本?
- ios - 有人可以在发布图片时帮助我解决一个奇怪的 firebase 错误吗?
- chisel - makeSink 方法为外围设备制作 IO 的目的是什么
- python-3.x - 从文本条目返回值到其他类
- python - 为什么sk学习中的k-fold不打印数组值
- ros - GazeboRosControlPlugin 缺失
- x3dom - 如何在 X3DOM IndexedFaceSet 中允许 180 度角
- firebase - 如何在firestore中构建多个级别
- android - 使用 R8 混淆应用程序会导致超出 GC 开销限制