如何使用 Fused Location Provider 跟踪用户是否有意关闭位置 API

How to track if user has intentionally turned off location, using Fused Location Provider API

我已经使用 Fused Location Provider API 让用户的当前 location.Things 在用户打开位置时正常工作。

但是我想在用户关闭定位功能时向他提供一条消息。当位置关闭时,requestLocationUpdates 不会调用 onLocationChanged 方法。可能这是预期的,但我想知道关闭位置时调用的是什么,以便我可以捕获它以通知用户。下面是我正在使用的代码(摘自 Whosebug 中的一个示例,link 我丢失了)。

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) {

   }

}

我认为您可以针对这个问题使用 LocationManagerHow to check if Location Services are enabled?

请完成可用于显示对话框的 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