FusedLocationApiは、廃止予定であることがわかるまで使用していました(以下の参考資料を参照)。実装は簡単でした。ドキュメントに記載されているように、GoogleApiClientと組み合わせて使用する必要があります
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
locationRequest, this);
私は最近FusedLocationProviderClientに変更しました(以下の参照を参照)チュートリアルに従って、FusedLocationProviderClientを正常に動作させることができました
チュートリアル: 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());
私が遭遇している問題は、ルーパースレッドです。アプリケーションがバックグラウンドにある場合でも、ルーパースレッドは実行を続けます。アプリケーションがバックグラウンドにあるときに位置情報の更新を一時停止し、アプリケーションがフォアグラウンドにあるときに位置情報の更新を再開したい。どうすればこれを達成できますか?
参照:
場所を取得したら、単に削除してくださいmFusedLocationClient.removeLocationUpdates
彼が上記の回答で述べたように。
if (mFusedLocationClient != null)
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
ルーパーは、削除するまでrequestLocationUpdates
と呼ばれます。
私の問題では、上で述べたように行いました。以下は私のコードです。
mFusedLocationClient.getLastLocation()
.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// GPS location can be null if GPS is switched off
if (location != null) {
mLocation = location;
if (mFusedLocationClient != null) {
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
}
} else {
startLocationUpdates();
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(HomeActivity.this, "Error trying to get last GPS location", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
以下は私のrequestLocationUpdates
なので、場所が利用可能になるまでリクエストを受け取ります。
private void startLocationUpdates() {
mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
getPackageManager().checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getPackageName());
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
getLastLocationNewMethod();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(HomeActivity.this, 0x1);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(HomeActivity.this, errorMessage, Toast.LENGTH_LONG).show();
// mRequestingLocationUpdates = false;
}
getLastLocationNewMethod(); // this method is where I can get location. It is calling above method.
}
});
}
注:詳細については、GitHub Repo[〜#〜] link [〜#〜] をご覧ください