1

Я использую API местоположения Google, чтобы показать местоположение пользователей на карте.Marshmallow - вопрос разрешения Runtime Google Maps

Когда приложение загружается в первый раз, отображается диалоговое окно логического обоснования, объясняющее, почему пользователю необходимо разрешить доступ к местоположению. Затем отображается runtime permission dialog, и пользователи нажимают «Разрешить», чтобы включить доступ к местоположению. Затем карта загружается без каких-либо сбоев.

Однако, когда приложение возобновляется (после входа в фон), диалоговое окно с обоснованием не появляется, поскольку пользователь уже предоставил доступ к местоположению. В этом случае появляется только runtime permission dialog. Теперь, если пользователь нажимает «Deny», приложение вылетает. Этот код прекрасно работает в Android версии ниже M (Lollipop, Jellybean, KitKat и др)

Есть ли способ обработать исключение во время выполнения на данном этапе?

Ошибка:

java.lang.SecurityException: Клиент должен иметь ACCESS_FINE_LOCATION разрешения просить места PRIORITY_HIGH_ACCURACY.

Я использую стандартный образец MyLocation демонстрационное приложение без каких-либо 3-сторонней библиотеки:

GoogleMaps MapDemo on Github

Я также попытался с помощью PermissionsDispatcher библиотеки, но одни и те же ошибки сохраняются.

PermissionDispatcher Android-Google-Maps-Demo

private void enableMyLocation() { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 
     // Permission to access the location is missing. 
     PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE, 
       Manifest.permission.ACCESS_FINE_LOCATION, true); 
    } else if (mMap != null) { 
     // Access to the location has been granted to the app. 
     mMap.setMyLocationEnabled(true); 
    } 
} 

Любая помощь высоко ценится.

+0

Сообщение код, где вы запрашиваете разрешения, пожалуйста, –

+0

Реализация принятия/отказа в разрешении не означает, что вы r будет работать нормально. Это зависит только от кода, который вы написали в этих случаях. Пожалуйста, опубликуйте методы обратного вызова onCreate() и запроса разрешений? –

+0

Я использую точный пример, приведенный в [link] (https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MyLocationDemoActivity. java) – Akshata

ответ

0

Убедитесь о том, что у вас есть добавить правильное разрешение в ваших файлах манифеста о том, что разрешение вы просите, и нужно точно

И может быть проблема с вашим кодом. Попробуйте эту библиотеку: RuntimePermission Library Чтобы запросить разрешение вручную.

0

Начиная с Android 6.0 (уровень API 23) пользователи grant permissions приложений, пока приложение работает, а не при установке приложения. Этот подход упрощает процесс установки приложения, поскольку пользователю не нужно предоставлять разрешения при установке или обновлении приложения. Он также дает пользователю больше контроля над функциональностью приложения.

Как проверить, если у вас есть разрешение:

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
Manifest.permission.ACCESS_FINE_LOCATION); 
How to request the permissions you need : 

if (ContextCompat.checkSelfPermission(thisActivity, 
Manifest.permission.ACCESS_FINE_LOCATION) 
!= PackageManager.PERMISSION_GRANTED) { 

ActivityCompat.requestPermissions(thisActivity, 
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 

// MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an 
// app-defined int constant. The callback method gets the 
// result of the request. 
} 
} 

Как получить доступ к результату запроса:

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
switch (requestCode) { 
case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: { 
// If request is cancelled, the result arrays are empty. 
if (grantResults.length > 0 
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

// permission was granted, yay! Do the task you need to do. 

} else { 

// permission denied, boo! Disable the functionality that depends on this permission. 
} 
return; 
} 
} 
} 

Вот родственный SO билет: Google Maps API Android v2 - "ACCESS_FINE_LOCATION" permission required with my-location layer enabled