最近調試授權bug相關問題,使用這個組件react-native-permissions,發現發起request授權,用戶授權或取消沒有回調;各種調試都沒有辦法解決。看下面代碼
import { check, request, PERMISSIONS, RESULTS, openSettings } from 'react-native-permissions';
let result = await check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE)
switch (result) {
case RESULTS.UNAVAILABLE:
//不支持該功能
Alert.alert('', '您的設備不支持該功能', [{ text: '確定' }]);
return;
case RESULTS.DENIED:
//該權限尚未被請求、被拒絕,但可請求
let req = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
if (req == RESULTS.DENIED) {
//Alert.alert('', '您已經拒絕授權', [{ text: '我知道了' }]);
Toast.show('您已經拒絕授權', {
duration: Toast.durations.SHORT,
position: Toast.positions.CENTER,
animation: false,//不顯示動畫
});
return;
}
break;
case RESULTS.GRANTED:
//授予權限
break;
case RESULTS.BLOCKED:
//該權限被拒絕
Alert.alert('提示', '您已經禁用APP讀寫手機儲存權限,圖片文件訪問受限', [
{
text: '關閉',
onDismiss: () => { }
},
{
text: '去設置開啓權限',
onPress: () => {
openSettings()
}
}
]);
return;
}
發起request授權let req = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
這段代碼後面不執行,一直等待沒有結果,查了很久才解決。
解決辦法:
在Android工程Java代碼MainActivity.java裏複寫onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){//
case 0://如果申請權限回調的參數
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this,"申請成功",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this,"拒絕權限",Toast.LENGTH_SHORT).show();
}
break;
}
}
原因:
首先6.0之前的權限 直接在 AndroidManifest 裏面申請就ok
6.0以後 包括6.0 都需要申請動態權限,onRequestPermissionsResult是授權回調處理,沒有的話就一直阻塞,等待導致後面部分代碼沒有執行。