如果用户选择从不选项,则为 Android 启用位置服务

Enable location services for Android if user chose Never option

如果用户之前选择了“从不”选项,是否有任何方法可以再次允许应用程序使用定位服务(或至少显示对话框)?

我没有在代码中找到任何方法来再次显示它,因为我总是在 onResult(..) 回调中得到 LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

    @Override
    public void onResult(LocationSettingsResult locationSettingsResult) {
        final Status status = locationSettingsResult.getStatus();
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                Log.i(TAG, "All location settings are satisfied.");
//                        startLocationUpdates();
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" +
                        "upgrade location settings ");

                try {
                    // Show the dialog by calling startResolutionForResult(), and check the result
                    // in onActivityResult().
                    status.startResolutionForResult(activity, REQUEST_CHECK_SETTINGS);

                } catch (IntentSender.SendIntentException e) {
                    Log.i(TAG, "PendingIntent unable to execute request.");
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " +
                        "not created.");
                break;
        }
    }

我找到的唯一解决办法是重新安装应用程序或清除数据。

对,从不就是从不!如果用户之前回答了 "not now" 到您应用的位置权限请求,您可以生成一个对话框询问权限。但是,如果他们选择了不再让您询问,那将是永久设置,您必须告诉他们删除并重新安装。 (如果他们的位置暂时关闭,但应用程序有权访问他们的位置,则会产生一个对话框,要求更改设备的位置服务状态。) 如果位置是应用程序的必要组成部分,您可以考虑在安装时要求访问权限。在即将推出的 Android M 中,可以为每个应用设置和重置单独的权限,有助于避免此类问题。

如果用户之前选择了“Never”选项,我没有找到任何启​​用位置服务的解决方法,所以我按照@Lesvmac 上面的回答再次询问用户删除并重新安装应用程序,但我认为这不是解决此问题的正确方法。

所以目前最好的办法是不允许"Never"选项出现在请求对话框中。尝试添加

builder.setAlwaysShow(true);

LocationSettingsRequest.Builder 这将导致只有“Yes”和“No”选项而不是默认的“Never”, “”&“不是现在”&你永远不会收到SETTINGS_CHANGE_UNAVAILABLE

完整方法如下:

 private void requestSettings() {
    LocationSettingsRequest.Builder builder =
            new LocationSettingsRequest.Builder()
                    .setAlwaysShow(true)
                    .addLocationRequest(request);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient,
                    builder.build());

    result.setResultCallback(this);
}

之前

之后

您需要手动允许该特定应用程序的权限才能重置请求权限对话框。

打开应用程序信息(通过从应用程序启动器拖动,或设置 - 应用程序 - [应用程序名称])

Select 权限

启用您用 "never ask again"

拒绝的权限

(可选)从这里再次禁用它;请注意,此时您的应用会在需要时再次请求权限。

Link: https://android.stackexchange.com/questions/125939/reset-the-request-permission-dialog-on-marshmallow

解决方案非常简单也很容易遗漏(至少在 Android 5.1 上)...

从屏幕顶部边缘向下滑动以获取下拉菜单。按 "App permission management"。按应用程序和您要更改权限的应用程序。瞧!