2017-10-03 3 views
1

Ich verwendete FusedLocationApi, bis ich erfuhr, dass es veraltet ist (siehe Referenzen unten). Es war einfach zu implementieren. Da die Dokumentation sagt, dass Sie es in Verbindung mit GoogleApiClientFusedLocationProviderClient Wann und wie Stop Looper?

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, 
         locationRequest, this); 

ich vor kurzem auf FusedLocationProviderClient geändert verwenden müssen (siehe Referenz unten) Nach einem Tutorial ich in der Lage war erfolgreich FusedLocationProviderClient Arbeits

Tutorial zu bekommen: https://github.com/codepath/android_guides/wiki/Retrieving-Location-with-LocationServices-API

// new Google API SDK v11 uses getFusedLocationProviderClient(this) 
getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, new LocationCallback() { 
     @Override 
     public void onLocationResult(LocationResult locationResult) { 
     // do work here 
     onLocationChanged(locationResult.getLastLocation(); 
     } 
    }, 
    Looper.myLooper()); 

Das Problem, in das ich hineingeraten bin, ist der Looper-Thread. Selbst mit der Anwendung im Hintergrund läuft der Looper-Thread weiter. Ich möchte die Standortaktualisierungen anhalten, wenn sich die Anwendung im Hintergrund befindet, und dann Standortaktualisierungen fortsetzen, wenn die Anwendung im Vordergrund ist. Wie kann ich das erreichen?

Referenzen:

  1. https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
  2. https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient

Antwort

5

Sie müssen nur mFusedLocationClient.removeLocationUpdates(mLocationCallback) in onPause() Ihrer Aktivität nennen. Aber es gibt ein bisschen mehr als nur das.

Verwenden Membervariablen für die FusedLocationProviderClient, GoogleApiClient und Location in Ihrer Haupttätigkeit:

import com.google.android.gms.location.FusedLocationProviderClient; 
import com.google.android.gms.location.LocationCallback; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationResult; 

public class MainActivity extends AppCompatActivity 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    FusedLocationProviderClient mFusedLocationClient; 
    GoogleApiClient mGoogleApiClient; 
    LocationRequest mLocationRequest; 

    //.......... 

eine Membervariable für die LocationCallback Verwenden Sie auch:

LocationCallback mLocationCallback = new LocationCallback(){ 
    @Override 
    public void onLocationResult(LocationResult locationResult) { 
     for (Location location : locationResult.getLocations()) { 
      Log.i("MainActivity", "Location: " + location.getLatitude() + " " + location.getLongitude()); 

     } 
    }; 

}; 

Anschließend weisen mFusedLocationClient in onCreate() :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

    //............... 
} 

Wenn Sie dann in onResume() den GoogleApiClient und den FusedLocationProviderClient eingerichtet haben, verwenden Sie sie. Ansonsten ist es das erste Mal ist, hat sich die Aktivität gestartet wurde, verbinden so die GoogleApiClient:

@Override 
public void onResume() { 
    if (mGoogleApiClient != null && mFusedLocationClient != null) { 
     requestLocationUpdates(); 
    } else { 
     buildGoogleApiClient(); 
    } 
} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    requestLocationUpdates() 
} 

public void requestLocationUpdates() { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(120000); // two minute interval 
    mLocationRequest.setFastestInterval(120000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); 
    } 
} 

Und schließlich in onPause(), rufen removeLocationUpdates():

@Override 
public void onPause() { 
    super.onPause(); 
    if (mFusedLocationClient != null) { 
     mFusedLocationClient.removeLocationUpdates(mLocationCallback); 
    } 
} 
+0

Diese klare jetzt ist, danke! – portfoliobuilder