Xamarin.Android应用程序不要求“ WriteExternalStorage”(但“ ReadExternalStorage”可以正常工作)

时间:2019-05-19 16:10:50

标签: c# xamarin.android android-permissions

我已经有一些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" />

我希望如果授予了权限,应用程序将在启动/单击按钮时进行检查(它会检查权限并在控制台中写入“权限被拒绝->正在请求”。)

但是在此之后,该应用应显示对话框“是否允许您的设备上的[…]应用??拒绝-允许”。如果我请求写入许可,则不会发生这种情况,但如果我请求读取,则会发生这种情况。

感谢Advance的任何帮助

菲尔

1 个答案:

答案 0 :(得分:0)

问题似乎不是代码,而是配置。
在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