位置服务.SettingsApi重置SETTINGS_CHANGE_UNAVAILABLE标志

14

我现在更新到Google Play服务v7.0+,并基于这个示例在Android中进行位置更新,我有以下代码来连接到LocationServices.SettingsApi并检查用户是否已准备好应用程序接收位置更新。

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
    builder.addLocationRequest(mLocationRequest);
    mLocationSettingsRequest = builder.build();

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(
                    mLocationClient,
                    mLocationSettingsRequest
            );
    result.setResultCallback(this);

其中this是以下回调函数:

    @Override
    public void onResult(LocationSettingsResult locationSettingsResult) {

        final Status status = locationSettingsResult.getStatus();
        Intent resolutionIntent;
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                // Everything is OK, starting request location updates
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                // Seems the user need to change setting to enable locations updates, call startResolutionForResult(Activity, REQUEST_CODE)
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Error, cannot retrieve location updates.
                break;
        }
    }

SUCCESS状态可以复现,只需启用GPS即可。

RESOLUTION_REQUIRED状态也可以复现,只需禁用GPS即可。

SETTINGS_CHANGE_UNAVAILABLE状态是个问题:如果用户在执行 RESOLUTION_REQUIRED 步骤时选择了“从不”,则结果始终会带有此状态。

Google Play服务是否有一个选项可以在用户选择“从不”选项时以编程方式重置标志呢?

我知道“从不”似乎意味着 “真的,不要再问我了!!!” 但我想创建一个选项以防用户改变主意,当然,如果可能的话。

这样的话,下次应用程序执行时,我就能再次收到状态 RESOLUTION_REQUIRED 并要求用户接受位置更新。

1个回答

33

LocationSettingsRequest.Builder有一个方法setAlwaysShow,该方法更改对话框的按钮:

始终显示对话框,没有“不再提示”选项来禁止此应用程序在未来显示对话框。 当将此标记设置为true时,如果位置设置不满足请求,则会显示对话框,即使用户以前选择了“不再提示”。 注意:仅当您的对话框是显式用户触发的操作的结果需要位置才能继续时,才使用此方法。取消此对话框也应取消已启动的操作。

如果调用setAlwaysShow(true);,则默认的稍后不再提示按钮将被替换为只有按钮,因此用户无法选择不再提示,您将永远不会收到SETTINGS_CHANGE_UNAVAILABLE

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
builder.setAlwaysShow(true); 
mLocationSettingsRequest = builder.build();

PendingResult<LocationSettingsResult> result =
        LocationServices.SettingsApi.checkLocationSettings(
                mLocationClient,
                mLocationSettingsRequest
        );

result.setResultCallback(this);

你怎么知道的? - Marian Paździoch
2
不错的解决方案!我注意到Google地图没有一个“永不”按钮,但是我无法弄清它是如何实现的,几乎要实现一个没有“永不”按钮的自定义对话框。你的解决方案救了我们一命! - Yuntao
17
请注意,如果您在请求时打开了飞行模式并关闭了位置信息,即使您已经设置了“始终显示”,您仍将收到“SETTINGS_CHANGE_UNAVAILABLE”的提示。 - Saik Caskey
@SaikCaskey 谢谢你。解决了我的问题。 - Jon McClung
@SaikCaskey 有没有办法让它在飞行模式下工作? - Jacopo Tosi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接