Я пытаюсь отобразить координаты GPS при нажатии кнопки в макете занятий. Когда я нажимаю кнопку, вызывается следующий метод:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Я получаю сообщение об ошибке
Для вызова требуется разрешение, которое может быть отклонено пользователем. Код должен явно проверять, доступно ли разрешение.
Я уже предоставил эти разрешения в моем AndroidManifest
. Ошибка устраняется, и приложение компилируется, когда я добавляю следующее перед вызовом lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Однако приложение вылетает, когда я нажимаю кнопку, которая вызывает getLocation при нажатии. Что происходит? Есть ли лучший / более простой способ получить GPS-координаты устройства?
android
locationmanager
пользователь
источник
источник
Ответы:
На уровне Android API (23) мы должны проверять разрешения. https://developer.android.com/training/permissions/requesting.html
У меня была такая же проблема, но у меня сработало следующее, и я могу успешно получить данные о местоположении:
(1) Убедитесь, что ваши разрешения указаны в манифесте:
(2) Убедитесь, что вы запрашиваете разрешения у пользователя:
(3) Убедитесь, что вы используете ContextCompat, поскольку он совместим со старыми уровнями API.
(4) В вашем сервисе определения местоположения или классе, который инициализирует ваш LocationManager и получает последнее известное местоположение, нам необходимо проверить разрешения:
(5) Этот подход сработал для меня только после того, как я включил @TargetApi (23) в начало моего метода initLocationService.
(6) Я также добавил это в свою сборку Gradle:
Вот мой LocationService для справки:
Я тестировал пока только устройство Android Lollipop. Надеюсь, что это работает для вас.
источник
ПРОСТОЕ РЕШЕНИЕ
Я хотел поддерживать приложения до api 23, и вместо использования
checkSelfPermission
я использовал try / catchисточник
Последняя часть процитированного вами сообщения об ошибке гласит:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Гораздо более быстрый / простой способ проверить, есть ли у вас разрешения, - это окружить ваш код
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Если у вас есть разрешения, будет выполняться часть «попытка», если нет - часть «ловушка».источник
Используйте мой класс индивидуального доступа, чтобы проверить или запросить разрешение
источник
если вы работаете с динамическими разрешениями и любыми разрешениями, такими как ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, дающая ошибку «не удается разрешить метод PERMISSION_NAME», в этом случае напишите код с именем разрешения, а затем перестройте свой проект, это восстановит файл манифеста (Manifest.permission).
источник
Если вы просто хотите проверить разрешения (а не запросить разрешения), я написал такое простое расширение:
Теперь, если я хочу проверить разрешение, я могу просто передать такое разрешение:
источник