Google Maps API Android v2 — требуется разрешение ACCESS_FINE_LOCATION с включенным слоем моего местоположения

Я хочу показать местоположение пользователя на Картах Google, включив уровень моего местоположения, но для этой функции требуется ссылка "ACCESS_FINE_LOCATION" для получения местоположения по GPS. Можно ли запретить GoogleMap пытаться чтобы получить местоположение от GPS?

Если я удалю разрешение "ACCESS_FINE_LOCATION" в файле манифеста, как только я пытаюсь отобразить карту, приложение вылетает со следующей ошибкой:

E/AndroidRuntime(28578): FATAL EXCEPTION: main
E/AndroidRuntime(28578): java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
E/AndroidRuntime(28578):    at android.os.Parcel.readException(Parcel.java:1425)
E/AndroidRuntime(28578):    at android.os.Parcel.readException(Parcel.java:1379)
E/AndroidRuntime(28578):    at bbj.a(SourceFile:424)
E/AndroidRuntime(28578):    at bbn.a(SourceFile:232)
E/AndroidRuntime(28578):    at maps.al.b.j(Unknown Source)
E/AndroidRuntime(28578):    at uh.h(SourceFile:642)
E/AndroidRuntime(28578):    at un.a(SourceFile:399)
E/AndroidRuntime(28578):    at uj.a(SourceFile:158)
E/AndroidRuntime(28578):    at ui.handleMessage(SourceFile:111)
E/AndroidRuntime(28578):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(28578):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(28578):    at android.app.ActivityThread.main(ActivityThread.java:5041)
E/AndroidRuntime(28578):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(28578):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(28578):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(28578):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(28578):    at dalvik.system.NativeStart.main(Native Method)

person Donkey    schedule 13.06.2013    source источник


Ответы (2)


Вы можете использовать шаблон LocationSource для указания своих собственных местоположений, которые могут быть откуда угодно. LocationSource — это интерфейс, который вы бы реализовали для некоторого объекта, который может предоставлять данные о местоположении. Вы регистрируете это с помощью setLocationSource() на GoogleMap. Вы реализуете методы activate() и deactivate() на своем LocationSource, которые будут вызываться, чтобы сообщить вам, когда вы должны начать и прекратить нажимать локации. Когда вы получаете исправления местоположения, вы вызываете onLocationChanged() по предоставленному OnLocationChangedListener.

Этот пример проекта демонстрирует использование LocationSource.

person CommonsWare    schedule 13.06.2013
comment
Спасибо за Ваш быстрый ответ! - person Donkey; 14.06.2013
comment
Теперь Google рекомендует использовать GoogleApiClient для работы с локациями. Здесь у меня есть открытый вопрос с наградой: stackoverflow.com/questions/28108326/ - person Daniele B; 26.01.2015

Можно ли запретить GoogleMap пытаться получить местоположение от GPS?

Реализация по умолчанию LocationSource не обязательно должна использовать GPS для возврата точных местоположений.

Если я удалю разрешение «ACCESS_FINE_LOCATION» в файле манифеста, как только я попытаюсь отобразить карту, приложение вылетит

Это связано с тем, что реализация по умолчанию использует LocationClient с LocationRequest.PRIORITY_HIGH_ACCURACY.

На данный момент вы не можете ничего сделать, кроме как следовать ответу CommonsWare, но я также рекомендую вам создать запрос функции на gmaps-api-issues, поэтому реализация по умолчанию не дает сбоев при выполнении GoogleMap.setMyLocationEnabled, когда вы запрашиваете только ACCESS_COARSE_LOCATION разрешение, а переключается на LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY.

person MaciejGórski    schedule 13.06.2013
comment
Теперь Google рекомендует использовать GoogleApiClient для работы с локациями. Здесь у меня есть открытый вопрос с наградой: stackoverflow.com/questions/28108326/ - person Daniele B; 26.01.2015