在获取当前位置流时,我使用 SettingsClient 根据当前 LocationRequest 检查位置设置是否得到满足。
目前,我的优先级设置为HIGH_ACCURACY,这需要不惜一切代价启用GPS。
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
settingsClient = LocationServices.getSettingsClient(this);
locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(500)
.setFastestInterval(500);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
locationSettingsRequest = builder.build();
现在,当我调用 SettingsClient.checkLocationSettings() 为其提供侦听器时,
settingsClient.checkLocationSettings(locationSettingsRequest)
.addOnCompleteListener(this)
.addOnFailureListener(this);
它落入onFailure(),github 上的 google 官方示例在这种情况下采取以下方法;
检查 onFailure() 中收到的异常状态码,如果是 LocationSettingsStatusCodes.RESOLUTION_REQUIRED,
然后调用startResolutionForResult(),它允许我们启用GPS,这使用onActivityResult等待结果。
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(LocationActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
showLocationError();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
showError();
break;
}
}
问题是,每当调用设置客户端的onFailure并调用startResolution时,它总是陷入Activity.RESULT_CANCELED情况。但奇怪的是,虽然这里说已取消,但几秒钟后GPS就打开了。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// fetch location here
break;
case Activity.RESULT_CANCELED:
// this is called immediately first time
// and second time even when GPS is on
break;
}
break;
}
}
打开 GPS 后,当我执行相同的操作(获取当前位置)时,SettingsClient 仍然调用 onFailure,并且尽管 GPS 已打开,结果始终为 Activity.RESULT_CANCELED。
问题在 Redmi 4X 和 Motorola Droid Turbo 上重现
还有其他人使用过这种方法的 SettingsClient 并遇到过类似的问题吗?
这是我正在关注的官方示例
官方 GitHub 问题页面也报告了此错误