SettingsClient的位置请求始终获得RESULT_CANCELED

时间:2019-04-06 15:16:37

标签: android location google-play-services android-gps

在获取当前位置信息流时,我正在使用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(),在这种情况下,google official samples on github采用以下方法;

检查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和这种方法并遇到任何类似问题的其他人吗?

Here is the official sample I am following

This bug is also reported on official GitHub issues page

2 个答案:

答案 0 :(得分:1)

我发现,在将PRIORITY_HIGH_ACCURACY添加到请求中时,由于位置模式已设置为“省电”,因此发生了这种情况,因此即使肯定回答为打开位置服务(实际上已打开),该模式仍然省电模式无法处理PRIORITY_HIGH_ACCURACY请求,因此您将获得RESULT_CANCELED,表明您的请求未得到满足。我不知道要求同时打开两个定位服务并将模式更改为“高精度”的方法,所以我只是取消了优先级,因为它对我的用例而言并不那么重要。

答案 1 :(得分:-1)

添加此行 bulider.setAlwaysShow(true);