2013-06-13 9 views
5

Chcę pokazać lokalizację użytkownika w Google Maps, umożliwiając my-location layer, ale ta funkcja wymaga zezwolenia "ACCESS_FINE_LOCATION", aby uzyskać lokalizację od GPS. Czy można zapobiec próbom pobrania lokalizacji z GPS przez urządzenie GoogleMap?Google Maps API Android v2 - uprawnienie "ACCESS_FINE_LOCATION" wymagane z włączoną warstwą mojej lokalizacji

Jeśli usunąć pozwolenie „ACCESS_FINE_LOCATION” w pliku manifestu, jak tylko spróbować, aby wyświetlić mapę, awarii aplikacji z powodu następującego błędu:

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) 

Odpowiedz

4

Można użyć wzoru LocationSource dostarczyć własne lokalizacje, które mogą pochodzić z dowolnego. LocationSource to interfejs, który można zaimplementować na obiekcie, który może dostarczać dane o lokalizacji. Zarejestruj się na setLocationSource() na GoogleMap. Implementujesz metody activate() i deactivate() na swoim LocationSource, które zostaną wywołane, aby poinformować Cię, kiedy powinieneś zacząć i zakończyć przesuwanie lokalizacji. Po wprowadzeniu poprawek lokalizacji wywołujesz onLocationChanged() na dostarczonym OnLocationChangedListener.

This sample project demonstruje użycie LocationSource.

+0

Dziękuję za szybką odpowiedź! – Donkey

+0

Teraz Google zaleca używanie GoogleApiClient do obsługi lokalizacji. Tutaj mam otwarte pytanie z nagrodą za nagradzanie: http://stackoverflow.com/questions/28108326/android-google-maps-location-with-low-battery-usage –

3

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

Domyślnie implmentation z LocationSource niekoniecznie muszą korzystać z GPS, aby powrócić dokładne lokalizacje.

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

To dlatego, że domyślna implementacja wykorzystuje LocationClient z LocationRequest.PRIORITY_HIGH_ACCURACY.

Na razie można zrobić nic więcej niż następującą odpowiedź CommonsWare, ale ja też zachęcam do tworzenia żądania funkcji na gmaps-api-issues, więc domyślna implementacja nie zawodzi, gdy robi GoogleMap.setMyLocationEnabled gdy wniosek tylko ACCESS_COARSE_LOCATION pozwolenie, ale przełącza się LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY.

+0

OK, dziękuję za te szczegóły! – Donkey

+1

Problem został otwarty: http://code.google.com/p/gmaps-api-issues/issues/detail?id=6421 – ercan

+0

Teraz Google zaleca używanie GoogleApiClient do obsługi lokalizacji. Tutaj mam otwarte pytanie z nagrodą za nagradzanie: http://stackoverflow.com/questions/28108326/android-google-maps-location-with-low-battery-usage –

Powiązane problemy