我的应用程序要求用户必须位于特定位置,然后才能使用某些功能。为了验证这一点,我将Google Location Services API用作Google Play服务(com.google.android.gms:play-services-location:16.0.0)的一部分。
这已经工作了好多年没有问题,但是由于Google最近在数据隐私方面的不良宣传,用户要求该应用程序不要求启用“ Google位置准确度”(又称为wifi扫描)。问题是-我认为Play服务不会允许我在没有设置的情况下检查设置。
示例代码:
LocationRequest mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setInterval(UPDATE_INTERVAL).setFastestInterval(FASTEST_INTERVAL_SUCCESS);
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
checkLastLocation(this);
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
mHelper.handleError(e.getMessage());
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
mHelper.onLocationReady();
break;
}
}
});
运行此代码后,如果禁用了Google位置准确度-即使启用了设备GPS,并且无论我在位置请求中设置的准确度级别(优先级)如何,任务始终会报告失败。 “ startResolutionForResult”将触发启用它的提示。
如果用户拒绝提示,那么我可以使用以下方法获取其他信息:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
LocationSettingsStates lss = LocationSettingsStates.fromIntent(data);
if (lss.isLocationPresent() && lss.isLocationUsable()) {
checkLastLocation(this);
}
}
这告诉我,即使他们拒绝了该提示,我对位置更新的请求也会成功,但是将由其他提供商提供。
理想情况下,我希望任务不会失败,但是如果必须这样做,我希望能够获得LocationSettingsStates 而无需,而需要使用startResolutionForResult()来打扰用户。 / p>
API建议我应该能够调用task.getResult()。getLocationSettingsStates()),但这仅在任务成功(不需要信息)时才有效-否则调用task.getResult ()生成ApiException(与发送到onFailure的相同)。