2015-02-13 9 views
12

Wprowadziłem więc nowy interfejs API Fused Location Provider, aby uzyskać lokalizację użytkownika, ale z jakiegoś powodu nie mogę uzyskać żadnej lokalizacji, chyba że GPS jest włączony. Nie zawsze, użytkownicy będą mieli włączony GPS i nie będę musiał prosić ich o włączanie GPS przy każdym ładowaniu aplikacji. W jaki sposób mogę powiedzieć interfejsowi API, aby udostępnił mi lokalizację z dowolnym dostawcą?Dostawca usługi Fusion Location nie uzyskuje lokalizacji, chyba że GPS jest włączony.

Oto mój kod:

public class FusedLocationService implements 
     LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    public interface OnLocationChangedListener { 
     public void OnLocationChanged(Location location); 
    } 

    private final String TAG = "SE8611"; 
    private boolean mRequestingLocationUpdates = true; 

    private OnLocationChangedListener mCallBack; 

    Service locationService; 
    private LocationRequest locationRequest; 
    private GoogleApiClient googleApiClient; 
    private Location mCurrentLocation; 
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) { 
     Logger.log(TAG, "FusedLocationService called"); 

     this.mCallBack = (OnLocationChangedListener)locationService; 

     locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(INTERVAL); 
     locationRequest.setFastestInterval(FASTEST_INTERVAL); 
     this.locationService = locationService; 

     googleApiClient = new GoogleApiClient.Builder(locationService) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     if (googleApiClient != null) { 
      googleApiClient.connect(); 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     if(mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     }else{ 
      Logger.log(TAG, "Location updates are already running."); 
     } 
    } 

    protected void startLocationUpdates() { 
     this.fusedLocationProviderApi.requestLocationUpdates(
       googleApiClient, locationRequest, this); 
     this.mRequestingLocationUpdates = false; 
    } 

    @Override 
    public void onLocationChanged(Location mCurrentLocation) { 
     Logger.log(TAG, "onLocationChanged called"); 
     this.mCurrentLocation = mCurrentLocation; 
     this.mCallBack.OnLocationChanged(this.mCurrentLocation); 
    } 

    public void startLocationUpdatesAfterResume(){ 
     if (googleApiClient.isConnected() && !mRequestingLocationUpdates) { 
      Logger.log(TAG, "startLocationUpdatesAfterResume called"); 
      this.startLocationUpdates(); 
     } 
    } 

    public void stopLocationUpdates() { 
     Logger.log(TAG, "stopping Location Updates"); 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       googleApiClient, this); 
    } 

    public Location getLocation() { 
     return this.mCurrentLocation; 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     this.mRequestingLocationUpdates = true; 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     this.mRequestingLocationUpdates = true; 
    } 
} 
+1

I M również doświadczasz tego problemu, rozwiązałeś to? – jzarsuelo

+0

samo stało się na moim tablecie Nexus 7, proszę podzielić się rozwiązaniem, jeśli jest rozwiązany, dzięki –

+0

Mając ten sam problem, brak lokalizacji, chyba że GPS jest włączony. Czy podałeś swój problem? – AAverin

Odpowiedz

0

wydaje się być za pomocą LocationRequest.PRIORITY_HIGH_ACCURACY, który preferuje za pomocą GPS powyżej w stosunku do innych metod. Możesz użyć PRIORITY_BALANCED_POWER_ACCURACY, która będzie korzystać z WiFi i wież komórkowych przed użyciem GPS.

Ponadto, ponieważ PRIORITY_BALANCED_POWER_ACCURACY jest "zgrubnym" poziomem dokładności, możesz chcieć odpowiednio zmienić pozwolenie na lokalizację w twoim manifeście.

więcej informacji na temat flag priorytetowych, możesz również chcieć je przejrzeć.

+1

Zdecydowanie to wypróbowałem. Jednak nie uzyskuję żadnej lokalizacji, gdy używam PRIORITY_BALANCED_POWER_ACCURACY. –

+0

Czy testujesz na emulatorze lub urządzeniu? – Abhishek

+0

Testuję na urządzeniu. Aby wyjaśnić, nie dostaję żadnej lokalizacji, jeśli nie mam włączonego GPS. –

2

Myślę, że znalazłem rozwiązanie problemu.

Jeśli przejdziesz do Ustawienia -> Prywatność i bezpieczeństwo -> Lokalizacja, zauważysz, że Lokalizacja to nie tylko GPS, ale w rzeczywistości pozwala użytkownikowi zdecydować, którzy dostawcy mogą być używane. Na przykład można ustawić, że tylko Wi-Fi i komórkowe powinny być używane do uzyskania dowolnych lokalizacji. Wyłączenie opcji Lokalizacja spowoduje wyłączenie wszystkich dostawców jednocześnie, a nie tylko GPS.

Aby przetestować tę aplikację dla użytkowników, którzy mają tylko Wi-Fi, można uzyskać lokalizację - zmień ustawienie na "Wifi + komórkowe".

5

Miałem ten sam problem jak ty, co wcale nie jest problemem. Android miał przycisk GPS, który pozwala sterować nim bezpośrednio, ale zastąpił go przyciskiem lokalizacji, który działa inaczej. Aby uzyskać dowolną lokalizację, należy ją włączyć. Tak jak ty, myślałem, że przycisk Lokalizacja włącza się i wyłącza tylko GPS, ale tak nie jest. Można kontrolować GPS poprzez zmianę trybu lokalizacji: 1. Wysoka dokładność (GPS, Wi-Fi i sieci komórkowe) 2. Oszczędzanie energii (Wi-Fi i sieci komórkowe) 3. GPS tylko

+0

Myślę, że ta odpowiedź rozwiązuje problem z lokalizacją i GPS. –

Powiązane problemy