3

我已经使用 FusedLocation Provider API来获取用户的当前位置。当用户打开位置时,一切正常。

但是如果他关闭了位置,我想向用户提供一条消息。关闭位置时,requestLocationUpdates不调用onLocationChanged方法。可能这是意料之中的,但我想知道关闭位置时会调用什么,以便我可以捕获它以通知用户。下面是我正在使用的代码(选自 Stackoverflow 中的一个示例,我丢失了该链接)。

public class FusedLocationService implements
    LocationListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = "FusedLocationService";

private static final long INTERVAL = 1000 * 30;
private static final long FASTEST_INTERVAL = 1000 * 5;
private static final long ONE_MIN = 1000 * 60;
private static final long REFRESH_TIME = ONE_MIN * 5;
private static final float MINIMUM_ACCURACY = 50.0f;
Activity locationActivity;
private LocationRequest locationRequest;
private GoogleApiClient googleApiClient;
private Location location;
private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;

FusedLocationReceiver locationReceiver = null;

public FusedLocationService(Activity locationActivity, FusedLocationReceiver locationReceiver) {
    this.locationReceiver = locationReceiver;
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(INTERVAL);
    locationRequest.setFastestInterval(FASTEST_INTERVAL);
    this.locationActivity = locationActivity;

    googleApiClient = new GoogleApiClient.Builder(locationActivity)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}

@Override
public void onConnected(Bundle connectionHint) {
    Log.i(TAG, "I'm connected now");
    Location currentLocation = fusedLocationProviderApi.getLastLocation(googleApiClient);
    if (currentLocation != null && currentLocation.getTime() > REFRESH_TIME) {
        location = currentLocation;
    } else {
        fusedLocationProviderApi.requestLocationUpdates(googleApiClient, locationRequest, this);
        // Schedule a Thread to unregister location listeners
        Executors.newScheduledThreadPool(1).schedule(new Runnable() {
            @Override
            public void run() {
                fusedLocationProviderApi.removeLocationUpdates(googleApiClient,
                        FusedLocationService.this);
            }
        }, ONE_MIN, TimeUnit.MILLISECONDS);
    }
}

@Override
public void onLocationChanged(Location location) {
    Log.i(TAG, "Location is changed!");
    //if the existing location is empty or
    //the current location accuracy is greater than existing accuracy
    //then store the current location
    if (null == this.location || location.getAccuracy() < this.location.getAccuracy()) {
        this.location = location;
// let's inform my client class through the receiver
        locationReceiver.onLocationChanged();
        //if the accuracy is not better, remove all location updates for this listener
        if (this.location.getAccuracy() < MINIMUM_ACCURACY) {
            fusedLocationProviderApi.removeLocationUpdates(googleApiClient, this);
        }
    }
}

public Location getLocation() {
    return this.location;
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

   }

}
4

2 回答 2

1

我认为您可以使用LocationManager这个问题:如何检查是否启用了位置服务?

于 2015-05-27T04:21:35.840 回答
0

请通过 SettingApi,您可以使用它来显示对话框。

https://developer.android.com/reference/com/google/android/gms/location/SettingsApi.html

浏览位置设置对话框。在这里,您可以找到与对话框相关的内容。

http://android-developers.blogspot.in/2015/03/google-play-services-70-places-everyone.html

于 2015-05-27T04:50:16.910 回答