java.lang.SecurityException: «пассивному» провайдеру местоположения требуется разрешение ACCESS_FINE_LOCATION на уровне API 26 - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть приложение для Android, и мы недавно перешли на уровень API 26 с 22.

Я проверял, есть ли у приложения одно из разрешений ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION.

Одна проблема, которую я нашел и не смог решить, это то, что она дает исключение "java.lang.SecurityException:« пассивный »поставщик местоположения требует разрешения ACCESS_FINE_LOCATION»

Мой файл манифеста Android имеет:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Также я получил такое исключение:

Process: edu.syr.ischool.orange.indoormap3, PID: 12666
    java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission.
        at android.os.Parcel.readException(Parcel.java:2005)
        at android.os.Parcel.readException(Parcel.java:1951)
        at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:802)
        at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1220)
        at utils.CheckinUtils.checkLocation(CheckinUtils.java:100)
        at utils.CheckinUtils.resume(CheckinUtils.java:247)

Также мой checkinUtil -> Метод checkLocation

 if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager = (LocationManager) activity.getSystemService(serviceString);
        Location lastKnow =  locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

Я проверил разрешение одного из них, как описано в https://developer.android.com/reference/android/location/LocationManager#getLastKnownLocation(java.lang.String)

Тем не менее, он дает исключение для ACCESS_FINE_LOCATION, но, поскольку он проходит условие if и выдает исключение безопасности, он должен иметь разрешение ACCESS_COARSE_LOCATION. Тогда почему происходит сбой приложения?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Решение:

Вместо этой строки:

if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

Напишите это:

if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

Вы получаете встроенное разрешение от Android, что может быть ошибкой.

Вы должны получить разрешение от Манифеста, о котором вы там упоминали.

Так что вместо android.Manifest.permission.ACCESS_FINE_LOCATION должно быть просто Manifest.permission.ACCESS_FINE_LOCATION

0 голосов
/ 04 августа 2019

Файл манифеста Android должен выглядеть следующим образом:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />

Подробнее вы можете найти здесь Запросить разрешения пользователя И используйте ваш код Java вместо: Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); как показано ниже

  try {
    Location lastKnow1 = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
    Location lastKnow2 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    Location lastKnow3 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    if(lastKnow1 != null){
       --- your code ---
    } if(lastKnow2 != null){
       --- your code ---
    } if(lastKnow3 != null){
       --- your code ---
    } else {
       --- Toast ---
    }
  } catch (Exception e) {
            e.printStackTrace();
          }

Используя приведенный выше код, вы никогда не столкнетесь с проблемами исключений. ** СЧАСТЛИВЫЙ КОДИНГ **

0 голосов
/ 07 сентября 2018

Насколько я понял, Вы только проверяете, предоставлено ли разрешение или нет.

Если ваше приложение / код не заканчивается, если разрешения не были предоставлены, обязательно запросите разрешения, позвонив ...

ActivityCompat.requestPermissions(this, permissionsStringArray,requestCodeInt);

А также при проверке собственных разрешений попробуйте использовать ContextCompat вместо ActivityCompat

...