因此,我有自定義位置服務類,從中我想要獲取最後一個已知的位置。有可能,我可以在GoogleApiClient連接之前調用getLastKnownLocation(),所以我必須等待它,然後調用getLastKnownLocation(),但我不知道如何管理它。我認爲RxJava 2可以幫助我,但我並不熟悉這個框架。這是我的課現在:等待onConnected調用,獲取位置
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;
import javax.inject.Inject;
import pl.pancor.android.air.base.FragmentScope;
@FragmentScope
public class LocationService implements Location.Service,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
ActivityCompat.OnRequestPermissionsResultCallback {
private static final String TAG = LocationService.class.getSimpleName();
private static final int PERMISSIONS_REQUEST = 13;
private GoogleApiClient mGoogleApiClient;
private Activity mActivity;
private android.location.Location mLastLocation;
private Location.Receiver mReceiver;
@Inject
LocationService(Activity activity) {
mActivity = activity;
}
@Override
public void getLastKnownLocation() {
if (isPermissionsGranted(true))
getLocation();
}
/**
* @param request if permissions aren't granted and {@param request} is true,
* then request permissions
* @return true if location permissions are granted
*/
private boolean isPermissionsGranted(boolean request) {
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
if (request) {
ActivityCompat.requestPermissions(mActivity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSIONS_REQUEST);
}
return false;
}
return true;
}
private void getLocation() {
if (mGoogleApiClient != null)
mLastLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
LatLng latLng = new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude());
mReceiver.lastKnownLocation(latLng);
} else {
Log.e(TAG, "NULLLLLLLLLLLLLLLLLLLLLLL");
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void setupReceiver(Location.Receiver receiver) {
mReceiver = receiver;
}
@Override
public void onStart() {
if (mGoogleApiClient != null){
mGoogleApiClient.connect();
} else {
mGoogleApiClient = getGoogleApiClient();
mGoogleApiClient.connect();
}
}
@Override
public void onStop() {
if (mGoogleApiClient != null)
mGoogleApiClient.disconnect();
}
private GoogleApiClient getGoogleApiClient(){
return new GoogleApiClient.Builder(mActivity)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode){
case PERMISSIONS_REQUEST:
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED){
getLastKnownLocation();
} else {
}
}
}
}
我需要以某種方式來檢查是否mGoogleApiClient連接(mGoogleApiClient.isConnected()),如果沒有,請等待連接,然後從FusedLocationApi得到的位置,但我不想要將方法放入onConnected(),因爲它有時會返回位置,當我不想返回位置時。
你能在一個小更詳細的解釋你是什麼意思: 「但我不想把方法放在onConnected(),因爲它有時會返回位置,當我不想返回位置。」 – mjekov
我的演示者調用mLocationService.getLastKnownLocation(),然後在LocationService中創建mGoogleApiClient並將其連接,並在onConnected()中放入mReceiver.lastKnownLocation(latLng),然後將位置發回給演示者。我更快地構建和連接mGoogleApiClient(onStart()在fragment中的onViewCreated()中調用),有時當我調用getLastKnownLocation()時,mGoogleApiClient尚未連接,所以我必須等待它。而現在,我不知道如何在沒有將mReceiver.lastKnownLocation(latLng)放入onConnected()的情況下等待它。 – Panczur