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

时间:2015-05-27 04:17:03

标签: android fusedlocationproviderapi

我使用了融合Location 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) {

   }

}

2 个答案:

答案 0 :(得分:1)

我认为你可以根据这个问题使用LocationManagerHow to check if Location Services are enabled?

答案 1 :(得分: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