【问题标题】:ReactNative - PermissionDialog after launching app - 'remove' won't workReact Native - 启动应用程序后的权限对话框 - “远程”不起作用
【发布时间】:2020-03-06 19:46:27
【问题描述】:

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

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

使用“删除”删除权限:

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

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

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

【问题讨论】:

    标签: react-native android-permissions


    【解决方案1】:

    这个答案对你来说可能有点奇怪,但我遇到了同样的情况,我需要在我当前的应用程序中使用 zip 提取的存储权限。

    我的管理方式如下:

    1. 我在 Android 代码中使用 React Native Bridging 请求了权限 概念。
    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2019-10-22
      • 2017-01-05
      相关资源
      最近更新 更多