Приложение Xamarin.Android не запрашивает «WriteExternalStorage» (но код отлично работает с «ReadExternalStorage») - PullRequest
0 голосов
/ 19 мая 2019

У меня уже есть некоторый опыт работы с C #, но я новичок в Android-Development и хотел начать с простого приложения проекта, которое может создать новый каталог с файлом на внешнем хранилище ("/ storage / emulated /0 / "[Android.OS.Environment.ExternalStorageDirectory.AbsolutePath]) и прочитайте его.

В документации я прочитал, что в более новых SDK недостаточно упомянуть разрешения (в данном случае" ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE ") в AndroidManifest.xml.Поэтому я добавил метод запроса их во время выполнения.

Моя проблема в том, что эмулятор [Android 8.1 API 27] (и мой телефон с отладкой по USB [Android 8.0]) не открывает диалоговое окно разрешения, еслиЯ запрашиваю "Manifest.Permission.WriteExternalStorage".Если я использую свой код для запроса «Manifest.Permission.ReadExternalStorage», появится диалоговое окно, вы можете принять и отклонить его, и действие отобразится в настройках.

Сначала я попытался написать свой собственный код в документации (https://docs.microsoft.com/de-de/xamarin/android/platform/files/external-storage),, который не открывает диалог. Я пытался позволить NuGet-пакету (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

Phil

1 Ответ

0 голосов
/ 20 мая 2019

Похоже, проблема была не в коде, а в конфигурации.
В 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

...