Google Maps API Android v2 - 启用my-location图层时需要“ACCESS_FINE_LOCATION”权限

时间:2013-06-13 14:05:44

标签: android google-maps-android-api-2 mylocationoverlay

我想在启用my-location layer的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)

2 个答案:

答案 0 :(得分:4)

您可以使用LocationSource模式提供您自己的位置,这些位置可能来自任何地方。 LocationSource是一个接口,您可以在某个可以提供位置数据的对象上实现该接口。您在setLocationSource()上使用GoogleMap注册了此内容。您在activate()上实施了deactivate()LocationSource方法,这些方法会在您启动和停止推送位置时通知您。当您获得位置修复时,请在提供的onLocationChanged()上致电OnLocationChangedListener

This sample project演示了LocationSource

的使用

答案 1 :(得分:3)

  

是否可以阻止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