我想在启用my-location层的Google Maps上显示用户的位置,但是此功能需要"ACCESS_FINE_LOCATION"权限才能从GPS获取位置。是否有可能阻止谷歌地图试图从GPS获取位置?
如果我在Manifest文件中删除权限"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)
您可以使用LocationSource
模式来提供您自己的位置,它可以来自任何地方。LocationSource
是一个接口,您可以在一些可以提供位置数据的对象上实现它。你在GoogleMap
上注册setLocationSource()
。你在你的LocationSource
上实现activate()
和deactivate()
方法,它们将被调用,让你知道何时应该开始和停止推过位置。当你得到位置固定,你调用onLocationChanged()
上提供的OnLocationChangedListener
。
这个示例项目演示了LocationSource
的使用。
是否有可能阻止GoogleMap从GPS获取位置?
LocationSource
的默认实现不一定要使用GPS来返回准确的位置。
如果我删除权限"ACCESS_FINE_LOCATION"在Manifest文件中,只要我试图显示地图,应用程序崩溃
这是因为默认实现使用LocationClient
和LocationRequest.PRIORITY_HIGH_ACCURACY
。
现在你可以做的只是遵循CommonsWare的答案,但我也鼓励你在gmaps-api-issues上创建一个功能请求,这样当你只请求ACCESS_COARSE_LOCATION
权限时,默认的实现在执行GoogleMap.setMyLocationEnabled
时不会失败,而是切换到LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
。