ReactNative - PermissionDialog после запуска приложения - «удалить» не будет работать - PullRequest
0 голосов
/ 11 ноября 2019

В приложении 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 голосов
/ 11 ноября 2019

Этот ответ может показаться вам немного странным, но я был в той же ситуации, когда мне нужно было использовать Storage Permission извлечения zip в моем текущем приложении.

Способ управления вещами таков:

  1. Я запросил разрешение в коде Android с использованием концепции React Native Bridging.
  2. Я добавляю задержку для отображения диалогового окна с разрешениями на следующем экране (т.е. после заставки)
  3. Когда пользователь дает мне разрешение, я запускаю извлечение и наложение загрузчика на полный экран.
  4. КогдаПользователь отказал в разрешении на хранение Я закрыл приложение.

Проверьте код ниже

NextScreen After Splash

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 Permission Library

@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();
}
...