Как это сделать, когда пользователь отклоняет разрешения в приложении? - PullRequest
2 голосов
/ 13 марта 2019

Я занимаюсь разработкой приложения, основной функцией которого является просмотр данных на карте.

Для этого мне нужно получить текущую позицию, а для этого я прошу пользователя.

Но если пользователь отклоняет разрешения, каков наилучший способ запросить его снова?

Я пытаюсь спросить снова в onRequestPermissionsResult, но приложение вылетает.

Есть идеи?

Код:

private void enableMyLocationIfPermitted() {    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        if (mapViewModel.getGoogleMap() != null) {
            mapViewModel.getGoogleMap().setMyLocationEnabled(true);
        } else {
            Log.e(TAG, "No Google Map available in view model");
        }
     } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
     }

}

@Override
public void onMapReady(GoogleMap googleMap) {
    Log.d(TAG, "Map is ready");
    googleMap.setOnMarkerClickListener(this);
    googleMap.getUiSettings().setRotateGesturesEnabled(false);
    googleMap.getUiSettings().setMyLocationButtonEnabled(false);
    mapViewModel.setGoogleMap(googleMap);
    enableMyLocationIfPermitted();
    getLastLocationIfPermitted();
    mapViewModel.loadData();
}


@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case LOCATION_PERMISSION_REQUEST_CODE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    enableMyLocationIfPermitted();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
                Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
            }
            return;
         }

     }
}

Ошибка:

java.lang.StackOverflowError: размер стека 8 МБ

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

StackOverflow -> Обычно это означает, что в вашем коде есть рекурсивный вызов.Рекурсия - это просто метод, который вызывает сам себя, вызывая переполнение стека и генерирование исключения StackOverflow.

Возможно, приложение не запрашивает пользователя снова, если пользователь отклоняет разрешение.Тогда этот поток ведет себя как бесконечный цикл.И вы получаете сбой, когда вы передаете размер стека

2 голосов
/ 13 марта 2019

Если пользователь отказал в разрешении с опцией «Никогда не спрашивать», ваш метод onRequestPermissionsResult будет вызывать себя вечно, пока не выдаст StackOverFlowError.

Лучшее, что можно сделать здесь, - это не запрашивать разрешение снова в методе onRequestPermissionsResult, как только пользователь откажется от него. Скорее вы можете отключить эту функцию или открыть настройки разрешений вашего приложения, чтобы они вручную изменили настройки разрешений, используя приведенный ниже код.

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case LOCATION_PERMISSION_REQUEST_CODE: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                enableMyLocationIfPermitted();
            } else {
                Toast.makeText(this, getResources().getText(R.string.you_need_permissions), Toast.LENGTH_LONG).show();
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
            return;
        }

    }
}

Если вы хотите узнать больше о разрешениях https://developer.android.com/training/permissions/requesting, это хорошее руководство.

1 голос
/ 13 марта 2019

Если пользователь отказывает в разрешении, значит, что пользователь не хочет делиться своими данными с вашим приложением, то почему вы хотите спрашивать его повторно, это раздражает пользователя, вы просто помещаете сообщение, чтобы сообщить пользователю, почему вы запрашивая разрешение, и в случае отказа пользователю не удается использовать определенную функцию приложения. Тем не менее, вы хотите повторно запрашивать разрешение, вам просто нужно показать диалоговое окно, когда пользователь отклоняет запрос «PLease разрешить это разрешение для дальнейшего использования приложения». и когда пользователь нажмет ок, снова откройте диалоговое окно с разрешениями.

...