vadimpopov94
@vadimpopov94
Dev

Как правильно вызвать Permission на работу с геолокацией?

Всем добрый день, в момент когда запрашиваю у пользователя разрешение на работу с геолокацией, приложение прекращает работу.
private static final int PERMISSION_REQUEST = 1;
@Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
        }else{
            setCurrentGeo();
        }
     }

Вот что пишет LogCat

06-19 12:30:04.284 20047-20047/popovvad.findme E/AndroidRuntime: FATAL EXCEPTION: main Process: popovvad.findme, PID: 20047 java.lang.RuntimeException: Unable to start activity ComponentInfo{popovvad.findme/popovvad.findme.MapActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.yandex.mapkit.mapview.MapView.onStart()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.yandex.mapkit.mapview.MapView.onStart()' on a null object reference at popovvad.findme.MapActivity.onStart(MapActivity.java:121) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334) at android.app.Activity.performStart(Activity.java:7029) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 06-19 12:30:04.316 20047-20085/popovvad.findme E/com.yandex.runtime.sensors.internal.LastKnownLocation: failed to get last known location: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.


Крашится на строчке с условием
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)

При этом если разрешение на геолокацию есть, то приложение идет дальше как положено и работает исправно, вот и возник вопрос как правильно вызвать диалог permission в этом случае ? Ещё на заметку, после того как приложение завершило роботу, появляется диалог на разрешение работы приложения с геолокацией.

Разрешения в манифесте
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  • Вопрос задан
  • 1161 просмотр
Решения вопроса 2
KuSu
@KuSu
Android разработчик
В твоем случае (судя по логу ошибки) проблема не в запросе разрешений, а в том, что твоя карта пытается получить координаты, когда еще пользователь не дал добро на gps
Ответ написан
Denchabaev
@Denchabaev
Android Developer
для всех permission можно использовать прекрасную библиотеку implementation "com.afollestad:assent:2.2.2"
для определения местоположения нужно добавить в манифест

а перед тем местом где нужна работа с местоположением нужно запросить разрешение вот таким вот способом:
runWithPermissions(Permission.ACCESS_FINE_LOCATION) { // например открытие фрагмента, где нужно использовать местоположение}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы