d3f*_*t3d 8 android android-external-storage react-native react-native-permissions
我已经尝试了大多数问题的结果,但没有一个对我有用。我尝试使用 PermissionAndroid.request 方法访问 WRITE_EXTERNAL_STORAGE 权限,但它总是返回 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.log(granted);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
// Start downloading
downloadFile();
console.log('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.log('++++' + err);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 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>
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。提前致谢。
编辑:targetSDKVersion:33 尝试在 Android 13 中测试应用程序
我对权限也有同样的问题POST_NOTIFICATIONS
,所以我环顾四周,发现这个github 问题发布在react-native 的存储库上,讨论了 和POST_NOTIFICATIONS
权限发生的这个问题WRITE_EXTERNAL_STORAGE
。
这解释了为什么在旧版本中该PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS)
方法返回时never_ask_again
没有任何提示,而不是grant。换句话说,Android 不知道旧 API 的权限,因为它根本不存在。
因此,正确的处理方法是在请求权限之前显式检查Android版本:
let notificationsPermissionCheck: PermissionStatus = "granted";
// The permission exists only for Android API versions bigger than 33 (Android 13),
// we can assume it's always granted beforehand
if (Platform.Version >= 33) {
notificationsPermissionCheck = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS
);
}
console.log("notificationsPermissionCheck:", notificationsPermissionCheck);
Run Code Online (Sandbox Code Playgroud)
至于WRITE_EXTERNAL_STORAGE
权限,在同一个github问题中,说明在Android 13中不需要WRITE_EXTERNAL_STORAGE
权限,并给出了这个例子:
async function hasAndroidPermission() {
if (Number(Platform.Version) >= 33) {
return true;
}
const permission = PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE;
const hasPermission = await PermissionsAndroid.check(permission);
if (hasPermission) {
return true;
}
const status = await PermissionsAndroid.request(permission);
return status === 'granted';
}
Run Code Online (Sandbox Code Playgroud)