ReactNative-启动应用程序后的PermissionDialog-'删除'将不起作用

时间:2019-11-11 05:31:57

标签: react-native android-permissions

在ReactNative应用程序中,我们正在使用“存储”权限来查看/保存图片。因此,我们在需要时获得运行时许可。但是奇怪的是,它是在Splash屏幕本身中请求许可的,而我们没有请求许可。然后我遇到了以下修复方法:

https://facebook.github.io/react-native/docs/removing-default-permissions

使用“删除”删除权限:

<uses-permission tools:node="remove" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但是问题是,如果我这样做,就无法在需要的地方获得这些权限。

因此,理想情况下,我想删除SplashScreen中的权限对话框,仅在需要的地方添加。请指教。

1 个答案:

答案 0 :(得分:0)

这个答案对您来说似乎有些奇怪,但是我处于同样的情况,我需要在当前应用程序中使用zip提取的存储权限。

我处理事情的方式如下:

  1. 我使用React Native Bridged在Android代码中请求了许可 概念。
  2. 我添加了延迟以在下一个屏幕上显示权限对话框(即 闪屏之后)
  3. 当用户授予我权限时,我开始将提取程序和覆盖程序加载器显示到全屏状态。
  4. 当用户拒绝存储权限时,我关闭了应用程序。

检查下面的代码

启动后进入下一屏

this.onZipExtracted = this.onZipExtracted.bind(this)

componentDidMount() {
    setTimeout(() => {
        Splash.hide()
    }, Platform.OS == 'ios' ? 1000 : 500);

    if (Platform.OS === 'android') {
        AsyncStorage.getItem("Extraction",(error,result)=>{
            if(result != 'done'){
                this.setState({
                    animating:true
                })
                setTimeout(() => {
                    expandPath.callReactMethod(this.onZipExtracted, (error) => {
                        console.log("Activation Inside Callback"+JSON.stringify(error))
//Do your stuff 

                    })
                }, 500)
            }
        })
    }
}

onZipExtracted(success){
    console.log("Activation Callback Extract Success -> "+JSON.stringify(success))
    this.setState({
        set loader flag
    })
    AsyncStorage.setItem("Extraction","done")
    Actions.replace('Screen to replace')
}

权限的Java代码

我使用了Dexter Android权限库

@ReactMethod
public void callReactMethod(Callback successCallback, Callback errorCallback){
    callUserPermission(getCurrentActivity(), successCallback,errorCallback);
}

private void callUserPermission(Activity currentActivity, Callback successCallback, Callback errorCallback) {
    Dexter.withActivity(getCurrentActivity())
            .withPermissions(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    // check if all permissions are granted
                    if (report.areAllPermissionsGranted()) {
                        Log.i(TAG, "onPermissionsChecked: -> Granted");

                         // Do your stuff here
                        }
                    } else {
                        currentActivity.finishAffinity();
                        System.exit(0);
                    }

                    // check for permanent denial of any permission
                    if (report.isAnyPermissionPermanentlyDenied()) {
                        // permission is denied permenantly, navigate user to app setting
                    }
                }


                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions,
                                                               PermissionToken token) {
                    token.continuePermissionRequest();
                }
            })
            .onSameThread()
            .check();
}