Разрешение Android отклоняется при запросе нескольких разрешений - PullRequest
1 голос
/ 01 мая 2019

Мне нужно спросить пользователя о разрешениях GPS и файловой системы в двух отдельных запросах.

Ожидаемое поведение: Приложение показывает запрос разрешений GPS, и после того, как пользователь примет решение, приложение отобразит запрос разрешения файловой системы и позволит пользователю снова принять решение.

Фактическое поведение: Отображается только запрос разрешения GPS, а разрешения файловой системы автоматически отклоняются без отображения какого-либо диалогового окна.

Целевая версия Android: 5.0 и выше (API 21 +)

Может кто-нибудь сказать, пожалуйста, как это исправить? Заранее спасибо!

Мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    checkLocationPermissions();
    checkLoggingPermissions();

    ...
    ...
}

private void checkLoggingPermissions() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            Log.i(TAG, "Requesting filesystem permissions from user");

            ActivityCompat.requestPermissions(this, new String[]
                    {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE);
        }
        else {
            LoggingService.init();
        }
    }
    else {
        LoggingService.init();
    }
}

private void checkLocationPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            Log.i(TAG, "Requesting GPS permissions from user");

            ActivityCompat.requestPermissions(this, new String[] {
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.INTERNET
            }, FrontendConstants.PERMISSION_GPS_REQUEST_CODE);
        }
        else {
            locationService = LocationService.getInstance(this);
        }
    }
    else {
        locationService = LocationService.getInstance(this);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) {
    if(FrontendConstants.PERMISSION_GPS_REQUEST_CODE == requestCode) {
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "+++ User accepted GPS permission request");
            locationService = LocationService.getInstance(this);
        }
        else {
            Log.e(TAG, "--- User rejected GPS permission request");
        }
    }

    if(FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE == requestCode) {
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "+++ User accepted filesystem permission request");
            LoggingService.init();
        }
        else {
            Log.e(TAG, "--- User rejected filesystem permission request");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 01 мая 2019

В идеале вы должны сделать это в одном запросе, чтобы упростить вещи для пользователя и для вас.

При этом, чтобы получить поток, который вы ищете, позвоните по номеру checkLoggingPermissions() из двух мест:

  1. Начиная с checkLocationPermissions(), если пользователь уже предоставил их из какого-то прошлого запуска вашего приложения (т. Е. В ветвях, где у вас есть locationService = LocationService.getInstance(this);)

  2. Начиная с onRequestPermissionsResult(), если пользователь только что предоставил права доступа к местоположению

И, , как упомянул Павел , удалите Manifest.permission.INTERNET, так какявляется normal разрешением и не требует проверки во время выполнения.

0 голосов
/ 01 мая 2019

Итак, я решил проблему, используя ваши советы. Мой подход теперь состоит в том, чтобы запрашивать все разрешения в одном запросе, а затем анализировать результаты в onRequestPermissionsResult.

Для этого я создал класс PermissionsHelper:

import android.content.pm.PackageManager;

public class PermissionsHelper {
    private String[] permissions;
    private int[] grantResults;

    public PermissionsHelper(String[] permissions, int[] grantResults) {
        this.permissions = permissions;
        this.grantResults = grantResults;
    }

    public boolean isPermissionGranted(String permission) {
        final int length = permissions.length;

        for(int i = 0; i < length; i++) {
            if(permissions[i].equals(permission)) {
                return grantResults[i] == PackageManager.PERMISSION_GRANTED;
            }
        }

        // if permission wasn't found, we weren't even asking for it, so we consider it
        // as granted
        return true;
    }

    public boolean arePermissionsGranted(String ... permissions) {
        for(String permission : permissions) {
            if(!isPermissionGranted(permission)) return false;
        }

        return true;
    }
}

Затем я делаю это в своей Деятельности, и кажется, что она отлично работает:

private void requestPermissions() {
    requestPermissions(new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    });
}

private void requestPermissions(String[] permissions) {
    List<String> notGranted = new ArrayList<>();

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        for(String permission : permissions) {
            if(checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                notGranted.add(permission);
            }
        }

        if(!notGranted.isEmpty()) {
            ActivityCompat.requestPermissions(this, notGranted.toArray(new String[0]),
                    FrontendConstants.PERMISSION_REQUEST_CODE);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    if(FrontendConstants.PERMISSION_REQUEST_CODE == requestCode) {
        PermissionsHelper helper = new PermissionsHelper(permissions, grantResults);

        if(helper.isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Log.i(TAG, "+++ User accepted filesystem permission request");
        }
        else {
            Log.e(TAG, "--- User rejected filesystem permission request");
        }

        if(helper.arePermissionsGranted(Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION)) {
            Log.i(TAG, "+++ User accepted GPS permission request");
        }
        else {
            Log.e(TAG, "--- User rejected GPS permission request");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...