2014-01-07 1 views
10

Angenommen, ich habe 5 verschiedene Aktivitäten in meiner App, die LocationClient.getLastLocation() verwenden möchten, um den letzten bekannten Standort zu ermitteln. Das scheint einfach zu sein.Den Fixed Location Provider LocationClient benutzerfreundlicher machen

Idealerweise würde ich einfach einen LocationClient in jeder Aktivität erstellen und getLastLocation() aufrufen. Es gibt jedoch noch einige zusätzliche Arbeiten, die zum Herstellen einer Verbindung mit den Google Play-Diensten erforderlich sind, z. B. den Anruf LocationClient.connect() und die Bearbeitung der Rückrufe , onDisconnected und . Die Dokumentation ist hier: https://developer.android.com/training/location/retrieve-current.html

Soweit ich sagen kann, muss jede meiner fünf verschiedenen Aktivitäten alle die Lifecycle-Methoden des LocationClient behandeln. Sie können auch getLastLocation() nicht sofort in onCreate() aufrufen, da die Verbindung für diese Aktivität möglicherweise noch nicht eingerichtet wurde.

Gibt es eine einfache Möglichkeit, den Lebenszyklus des LocationClient zu vereinfachen, so dass getLastLocation() sofort in jeder neuen Aktivität funktioniert, sobald ich die Verbindung einmal für meine App hergestellt habe?

+0

Haben Sie eine Lösung für diese Frage gefunden? –

Antwort

1

Sie können eine Basisaktivität erstellen, die alle diese Methoden implementiert, und dann müssen alle Ihre Aktivitäten nur diese erweitern.

als Referenz-Check: android how to create my own Activity and extend it?

+1

löst nicht das Problem, getLastLocation() sofort in onCreate() aufrufen zu können. Jede Aktivität müsste immer noch auf den onConnected-Callback warten, bevor sie getLastLocation() verwenden könnte. – emmby

+0

@emmby Sie müssen den Lebenszyklus irgendwie verwalten ... Haben Sie sich mit der Verwendung von Fragmenten mit einer einzigen Aktivität befasst? Abhängig davon, was Sie in den einzelnen Aktivitäten tun, funktioniert dies möglicherweise nicht, aber wenn dies der Fall ist, können Sie den Lebenszyklus für alle untergeordneten Fragmente verwalten. –

5

Ich habe Fused Location Provider APIs verwendet, um regelmäßige Standortaktualisierungen zu erhalten. Ich habe es in einem Hintergrunddienst implementiert (z. B. LocationUpdateService extends Service). Früher habe ich Android Location Framework APIs verwendet, aber es ist nicht gut für den Akkuverbrauch. Fused Location Provider-APIs sind die besten für eine effiziente Batterieverwendung.

Ich habe auch eine Notiz von Schritten vorbereitet, die notwendig sind, um es (zusammen mit anderen nützlichen Informationen) zu implementieren. In einfachen Worten, es ist der beste Weg, um Standortdaten in Android-Plattform ab sofort zu erhalten. Die Google Play-Dienste stellen viele Standort-APIs bereit, um die Standortdaten abzurufen (z. B. den aktuellen Standort des Nutzers oder den letzten bekannten Standort des Geräts).

Der Fused Location Provider ist eine der Standort-APIs in Google Play-Diensten. Dies sind die Voraussetzungen:

  1. Google SDK Play-Dienste verwendet wird, wie Bibliotheksprojekt (und auch Google PlayService richtig in Ihrem Gerät installiert ist).

  2. Laden Sie die Google Play-Dienstkomponente vom SDK-Manager herunter, installieren Sie sie und fügen Sie die Bibliothek zu Ihrem Projekt hinzu.
  3. Importieren Sie die GooglePlayServices-Bibliothek von Android google-play-services_lib in Ihrem Entwicklungsprojekt als Bibliotheksprojekt.
  4. Sie sollten ein tatsächliches Gerät haben, da diese API im Emulator nicht funktioniert.

Der fusionierten Location Provider verwaltet auf intelligente Weise die zugrunde liegende Ortungstechnologie (GPS/Wi-Fi/Netzwerkanbieters Verbindung) und gibt uns die beste Lage nach unseren Bedürfnissen.

Warum es

Wir sind einer der Standortanbieter (Netzwerk oder GPS) und Anfrage Standort Updates oder Alarm einrichten Nähe wählen könnte. Bei diesem Ansatz gab es jedoch zwei Hauptprobleme: 1. Falls wir einen genauen Standort definieren müssen, mussten wir zwischen Netzwerk- und GPS-Standortanbietern wechseln (da GPS nicht in Innenräumen funktioniert). 2. Annäherungsalarme wurden verwendet, um einen Benutzer über die Nähe zu einem Standort zu informieren, was sich auf die Akkulaufzeit auswirkte.

Vorteile

  1. Einfache APIs: Es uns auf hohe Ebene wie „hohe Genauigkeit“ muss angeben lassen ist oder „low power“, statt über Standort-Anbieter zu kümmern.
  2. Batterie effizient: Es minimiert den Stromverbrauch der App. Basierend auf allen eingehenden Standortanfragen und verfügbaren Sensoren wählt der fusionierte Standortanbieter den effizientesten Weg, um diese Anforderungen zu erfüllen.

Schritte, dieses API zu verwenden:

  1. Deklarieren Sie die ortsbezogenen Erlaubnis in der Manifest-Datei.

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    

    Oder

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    
  2. implementieren ähnliche Schnittstellen und Rückrufe. Bevor wir Standortaktualisierungen anfordern, müssen wir zunächst die Schnittstellen implementieren, die Ortungsdienste nutzt Verbindungsstatus unserer App zu kommunizieren:

    • com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks: Gibt Methoden, die Location Services aufruft, wenn ein Standort Client verbunden ist oder getrennt.
    • com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener
  3. Verbindung zu Google Play-Diensten, LocationClient auf den Google-API zu verbinden. Dazu erstellen Sie ein LocationClient Objekt (Instanz GoogleApiClient) als:

    mLocationClient = new GoogleApiClient.Builder(getApplicationContext()) 
        .addApi(LocationServices.API).addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this).build(); 
    

    Und dann mLocationClient.connect(); nennen.

  4. Eine Instanz von FusedLocationProviderApi unter Verwendung der LocationServices Klasse:

    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 
    
  5. Abrufen der aktuellen Position innerhalb onConnected(Bundle bundle):

    Location currentLocation = fusedLocationProviderApi         .getLastLocation(mLocationClient); 
    if (mCurrentLocation != null) { 
        Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() + 
         " - " + mCurrentLocation.getLongitude()); 
    }   
    
  6. Erstellen und Einrichten eines LocationRequest Objekt:

    mLocationRequest = new LocationRequest(); 
    
    private void setLocationParameter() { 
        // Set the update interval 
        mLocationRequest.setInterval(Constants.SECONDS_TO_UP); 
        // Use high accuracy 
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
        // Set the interval ceiling to one minute 
        mLocationRequest.setFastestInterval(Constants.SECONDS_TO_UP); 
        // Set the distance to 10 meters. 
        mLocationRequest.setSmallestDisplacement(Constants.METERS_TO_UP); 
    } 
    
  7. Um periodische Standortaktualisierungen von den Standortdiensten zu erhalten, senden wir eine Anfrage mithilfe eines Standortclients.

    LocationListener listener = new LocationListener() { 
        @Override 
        public void onLocationChanged(Location location) {  
         Utils.locationUpdates = Utils.locationUpdates + 1; 
         if (Utils.locationUpdates == 1) { 
          mLocationRequest .setPriority(LocationRequest.PRIORITY_LOW_POWER); 
          LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, listener); 
         } 
        } 
    }; 
    
+0

Dies beantwortet nicht die Frage, wie LocationServices über verschiedene Aktivitäten hinweg verwaltet werden ein klügerer Weg. – eskalera