【发布时间】:2017-03-08 15:12:53
【问题描述】:
所以,我有自定义位置服务类,我想从中获取最后一个已知位置。有可能,我可以在连接 GoogleApiClient 之前调用getLastKnownLocation(),所以我必须等待它然后调用getLastKnownLocation(),但我不知道如何管理它。我在想 RxJava 2 可以帮助我,但我还不熟悉那个框架。这是我现在的课:
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() 中,因为它有时会返回位置,而我不需要返回位置。”
-
我的演示者调用 mLocationService.getLastKnownLocation(),然后在 LocationService 中我可以构建 mGoogleApiClient 并连接它,然后在 onConnected() 中放置 mReceiver.lastKnownLocation(latLng),这会将位置发送回演示者。我更快地构建和连接 mGoogleApiClient(onStart() 在片段中的 onViewCreated() 中调用),有时当我调用 getLastKnownLocation() 时,mGoogleApiClient 尚未连接,所以我必须等待它。现在我不知道如何在不将 mReceiver.lastKnownLocation(latLng) 放入 onConnected() 的情况下等待它。
标签: android location android-googleapiclient