Запрос разрешения на определение местоположения во время выполнения

У меня есть запрос, реализующий RuntimePermission для Location. Когда я попытался requestLocationUpdates, я получил LintError, предлагающий мне добавить PermissionCheck для этой строки. Учитывая, что я реализовал разрешения во время выполнения. Так вот как это выглядит,

if (isNetworkEnabled() && networkListener != null) {
        if (ActivityCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(context,
                        Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(activity, new String[]
                    {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);

        } else
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkListener);
}

И мой основной класс реализует обратный вызов onRequestPermissionsResult. Это похоже,

switch (requestCode) {
        case REQUEST_LOCATION:
                if (grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkListener);
                } else
                    Message.displayToast(context, "Without enabling permission, you can't access this feature");
            break;
    }

После предоставления разрешения я снова запрашиваю обновления местоположения. Но он снова показывает LintError, чтобы добавить PermissionCheck. Обратитесь к изображению ниже

введите здесь описание изображения

Просто для пробы я checkSelfPermission перед запросом requestLocationUpdate внутри onRequestPermissionsResult и ошибка исчезла. Как показано ниже.

if (ActivityCompat.checkSelfPermission(context, permissions[0]) == PackageManager.PERMISSION_GRANTED &&
                            ActivityCompat.checkSelfPermission(context, permissions[1]) == PackageManager.PERMISSION_GRANTED)

Итак, мой вопрос: нужно ли мне еще раз проверять разрешение, если пользователь предоставил разрешение? Поправьте меня если я ошибаюсь!


person Kavin Prabhu    schedule 10.02.2016    source источник
comment
Но зачем это нужно? После того, как разрешение предоставлено, я запрашиваю обновление! Просто пытаюсь понять вариант использования.   -  person Kavin Prabhu    schedule 10.02.2016
comment
Lint знает, что любой вызов, требующий разрешения пользователя, должен быть обернут вокруг оператора проверки разрешения и, следовательно, ошибки Lint. Вы можете выполнить эту программу без каких-либо проблем, если знаете, что исключение не будет выдано.   -  person Much Overflow    schedule 10.02.2016
comment
Я бы поместил проверку разрешений и логику обновления местоположения в функцию с именем checkAndCallLocationUpdates и вызвал бы ее из onRequestPermissionResult   -  person Much Overflow    schedule 10.02.2016
comment
Я даже пытался, имея общую функцию. Но у меня есть некоторые локальные переменные, которые нельзя получить из onRequestPermissionsResult, поэтому я их удалил. Но это был вопрос, просто чтобы понять, почему это так. Если это так, я должен проверить это снова. Спасибо за ваш быстрый ответ. Ценить это   -  person Kavin Prabhu    schedule 10.02.2016


Ответы (1)


Вам нужно проверить наличие checkSelfPermission, потому что в последней версии ОС 6 (Marshmallow) вы можете отозвать разрешения, предоставленные для приложения, зайдя в настройки.
Таким образом, даже если пользователь предоставил разрешения приложению во время установки, во время выполнения вам необходимо дважды проверить, есть ли у вашего приложения разрешения, или пользователь отозвал эти разрешения.

person Saurabh7474    schedule 10.02.2016