我曾经使用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());
我遇到的问题是活套线程。即使应用程序在后台,looper线程也会继续运行。我想在应用程序在后台时暂停位置更新,然后在应用程序在前台时恢复位置更新。我怎样才能做到这一点?
参考文献:
https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi
https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient
最佳答案
你只需要在你的活动中调用mFusedLocationClient.removeLocationUpdates(mLocationCallback)
。然而,它有一点不止这些。
在主活动中使用fusedlocationproviderclient、googleapiclient和locationrequest的成员变量:
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;
//..........
对locationcallback也使用成员变量:
LocationCallback mLocationCallback = new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
for (Location location : locationResult.getLocations()) {
Log.i("MainActivity", "Location: " + location.getLatitude() + " " + location.getLongitude());
}
};
};
然后,在
onPause()
中指定mFusedLocationClient
:@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
//...............
}
然后在
onCreate()
中,如果设置了GoogleApiclient和FusedLocationProviderClient,则使用它们。否则,这是活动首次启动,因此请连接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());
}
}
最后,在
onResume()
中,调用onPause()
:@Override
public void onPause() {
super.onPause();
if (mFusedLocationClient != null) {
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
}
}