欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

react-native-permissions发起request授权,用户授权或取消没有回调解决

程序员文章站 2022-06-05 14:19:53
...

最近调试授权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是授权回调处理,没有的话就一直阻塞,等待导致后面部分代码没有执行。