Я уже пробовал результаты по большинству вопросов, но ни один из них не работал для меня. Я пытаюсь получить доступ к разрешению 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.
Начиная с 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
Но проблема в том, что я никогда не получал приглашение разрешить или запретить разрешение в первую очередь
Так как вы проверяете свой код на уровне 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
предоставьте версию Android, в которой вы проверяете это