【Android】SettingsApiで、LocationSettingsResultのステータスをSETTINGS_CHANGE_UNAVAILABLEから復旧する方法

## はじめに

SettingsApiを使用してGPSの設定をする際、ダイアログの【変更しない】を選択してしまうと、以後ダイアログが表示されず、（本体の設定画面から変更しても）毎回ステータスが`SETTINGS_CHANGE_UNAVAILABLE`になってしまう。


解決するには、`LocationSettingsRequest.Builder`に、

```.java
builder.setAlwaysShow(true);
```

を設定すればよい。


## 修正前
↓の記事を参考にさせていただき、SettingsApiを使用してGPSの設定ダイアログを開くようにした。

[FusedLocationApiを使うときはSettingsApiを使ってユーザの設定を確認すべし (GPSオンだけでは不十分な時がある)](http://qiita.com/daisy1754/items/aa9ad75d1a84b745469b)

以下、修正前のコード。

```.java

    public static void checkLocationPreference() {
        LocationRequest request =  new LocationRequest()
                .setInterval(1000)
                .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(request);

        PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(
                mGoogleApiClient, builder.build());

        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult locationSettingsResult) {
                /* 本体のGPSの設定を確認 */
                final Status status = locationSettingsResult.getStatus();
                switch(status.getStatusCode()) {
                    /* 現在地が取得できる設定になっている場合 */
                    case LocationSettingsStatusCodes.SUCCESS:
                        break;
                    /* 現在地が取得できない設定なので、設定画面を開く */
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        try {
                            status.startResolutionForResult(activity, REQUEST_CODE);
                        } catch (IntentSender.SendIntentException e) {}
                        break;
                    /* 一度でも【変更しない】を選択すると、以後は全部このステータス */
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        break;
                }
            }
        });
    }


```

これを実行すると、GPSがOFFの場合（`case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:`の場合）以下のような三択のダイアログが出る。

![before.jpg](https://qiita-image-store.s3.amazonaws.com/0/71593/186de645-ebaa-0bb9-c003-9b446b1d7767.jpeg)



ここで、【はい】もしくは【後で行う】を設定すれば以後GPSをOFFにした際にもダイアログが出るのだが、
【変更しない】を選択すると、今後このダイアログが出現せず、常に`case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:`になってしまう。

英語設定だと【NEVER】と表示されているので、どうやら【（今後一生）変更しない】という意味らしい。


## 修正後

これを修正するには、

```.java

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(request);

```

を、以下のように修正。

```.java
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .setAlwaysShow(true) // ← これを追加
                .addLocationRequest(request);

```

このように設定すると、

![after.jpg](https://qiita-image-store.s3.amazonaws.com/0/71593/5c63e1cb-2c41-3656-eb44-b1514f97f18f.jpeg)


というような二択のダイアログになり、【いいえ】を選んでも、何度でもダイアログを出すことができる。


## 参考
http://stackoverflow.com/questions/31524931/enable-location-services-for-android-if-user-chose-never-option

さすがstackoverflow、なんでもありますね。