PermissionAndroid.request() всегда возвращает never_ask_again без запроса. Реагировать на родной

Я уже пробовал результаты по большинству вопросов, но ни один из них не работал для меня. Я пытаюсь получить доступ к разрешению WRITE_EXTERNAL_STORAGE с помощью метода PermissionAndroid.request, но в результате он всегда возвращает never_ask_again.

Мой файл запроса:

try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
          {
            title: 'External Storage Write Permission',
            message: 'App needs write permission',
          },
        );

        console.info(granted);
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
          // Start downloading
          downloadFile();
          console.info('Storage Permission Granted.');
        } else {
          // If permission denied then show alert
          Alert.alert('Error', 'Storage Permission Not Granted');
        }
      } catch (err) {
        // To handle permission related exception
        console.info('++++' + err);
      }
    }

Это мой файл AndroidManifest.xml

<manifest xmlns:android = "http://schemas.android.com/apk/res/android">
  <uses-permission android:name = "android.permission.INTERNET" />
  <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW"/>
  <uses-permission android:name = "android.permission.CAMERA"/>
  <application android:name = ".MainApplication" android:usesCleartextTraffic = "true" android:label = "@string/app_name" android:icon = "@mipmap/ic_launcher" android:roundIcon = "@mipmap/ic_launcher_round" android:allowBackup = "false" android:theme = "@style/AppTheme">
    <activity android:name = ".MainActivity" android:label = "@string/app_name" android:configChanges = "keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode = "singleTask" android:windowSoftInputMode = "adjustResize" android:exported = "true">
      <intent-filter>
        <action android:name = "android.intent.action.MAIN" />
        <category android:name = "android.intent.category.LAUNCHER" />
        <action android:name = "android.intent.action.DOWNLOAD_COMPLETE"/>
      </intent-filter>
    </activity>
  </application>
</manifest>

Пожалуйста, помогите мне с решением проблемы. Заранее спасибо.

Редактировать: targetSDKVersion: 33 пытается протестировать приложение в Android 13

предоставьте версию Android, в которой вы проверяете это

jayesh gurudayalani 23.05.2023 12:13

Я добавил детали

d3f4u1t3d 24.05.2023 10:00
0
2
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вероятно, это ожидаемый результат от потока разрешений на Android.

Начиная с Android 11, если пользователь нажимает «Запретить» для получения определенного разрешения более одного раза в течение срока действия вашего приложения, установленного на устройстве, пользователь не видит диалоговое окно системных разрешений, если ваше приложение снова запрашивает это разрешение. Действие пользователя подразумевает «больше не спрашивать».

Взято с https://developer.android.com/about/versions/11/privacy/permissions#dialog-visibility

В react-native-permission есть хорошая блок-схема потока разрешений: https://github.com/zoontek/react-native-permissions#android-flow

Но проблема в том, что я никогда не получал приглашение разрешить или запретить разрешение в первую очередь

d3f4u1t3d 24.05.2023 09:59
Ответ принят как подходящий

Так как вы проверяете свой код на уровне API 33 (Android 13), вам нужно пропустить проверку и запросить разрешение для WRITE_EXTERNAL_STORAGE на уровне API 33, поскольку новые версии Android ввели ограничения на доступ к хранилищу и обеспечивают безопасный способ доступа к данным. Рекомендуется всегда записывать ваши данные только в каталог приложения (кэш-каталог), если нет необходимости показывать данные пользователю. Для получения дополнительной информации, связанной с изменениями хранилища, перейдите к этой документации.

Ссылки:-

https://developer.android.com/about/versions/11/privacy/storage

https://developer.android.com/training/data-storage/shared/media

https://stackoverflow.com/a/74296799/5696047

Другие вопросы по теме