Google Maps API Android v2 - “ACCESS_FINE_LOCATION” permission required with my-location layer enabled

♀尐吖头ヾ 提交于 2019-11-28 08:06:43

问题


I want to show the location of the user on a Google Maps enabling my-location layer, but this functionality requires the "ACCESS_FINE_LOCATION" permission to get the location from the GPS. Is it possible to prevent the GoogleMap from trying to get the location from the GPS?

If I remove the permission "ACCESS_FINE_LOCATION" in the Manifest file, as soon as I try to display the map, the app crashes with the following error:

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)

回答1:


You can use the LocationSource pattern to supply your own locations, which could come from whatever. LocationSource is an interface, which you would implement on some object that can supply location data. You register this with setLocationSource() on the GoogleMap. You implement activate() and deactivate() methods on your LocationSource that will get called to let you know when you should start and stop pushing over locations. As you get location fixes in, you call onLocationChanged() on a supplied OnLocationChangedListener.

This sample project demonstrates the use of LocationSource.




回答2:


Is it possible to prevent the GoogleMap from trying to get the location from the GPS?

Default implmentation of LocationSource doesn't necessarily have to use GPS to return accurate locations.

If I remove the permission "ACCESS_FINE_LOCATION" in the Manifest file, as soon as I try to display the map, the app crashes

This is because the default implementation uses LocationClient with LocationRequest.PRIORITY_HIGH_ACCURACY.

For now you can do nothing more than following CommonsWare's answer, but I also encourage you to create a feature request on gmaps-api-issues, so the default implementation doesn't fail when doing GoogleMap.setMyLocationEnabled when you request only ACCESS_COARSE_LOCATION permission, but switches to LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY.



来源:https://stackoverflow.com/questions/17089141/google-maps-api-android-v2-access-fine-location-permission-required-with-my

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!