Androidでは端末設定で位置情報を無効にできます。また、位置情報の精度を有効にしていないと十分な精度の位置情報を取得することができません。
![]() |
![]() |
アプリで位置情報が必要なときに、アプリとしてランタイムパーミッションの許諾をもらえたとしても、端末設定で無効になっている場合は取得できません。
この設定はシステム設定アプリの中で行うため、Settings.ACTION_LOCATION_SOURCE_SETTINGS を使って、設定画面に飛んでもらい、そこで設定してもらう。というのが正攻法の一つですが、アプリから離脱する必要があることと、直接的にONにするだけの画面ではないため、ユーザーが何をすればいいのか分からず、混乱してしまう可能性があります。
ダイアログを表示して設定を変更してもらう
GMSが使える環境限定にはなりますが、アプリ上に設定ダイアログを表示して、そこで設定してもらうことも可能です。
まずはGMSが使える環境であることを確認します。GoogleApiAvailabilityを使ってチェックします。
if (GoogleApiAvailability.getInstance()
.isGooglePlayServicesAvailable(context) != ConnectionResult.SUCCESS) {
return
}
取得したい位置情報リクエストLocationRequestから、設定リクエストLocationSettingsRequestを作成します。
val request = LocationRequest.Builder(0L)
.setPriority(Priority.PRIORITY_HIGH_ACCURACY)
.build()
val settingRequest = LocationSettingsRequest.Builder()
.addLocationRequest(request)
.build()
SettingsClientを使って位置情報設定をチェックします。
成功すれば位置情報が取得できる状態です。
失敗した際、ResolvableApiExceptionが帰ってきた場合、startResolutionForResultを呼び出すことで、前述のダイアログが表示されます。
LocationServices.getSettingsClient(activity)
.checkLocationSettings(settingRequest)
.addOnSuccessListener {
// 位置情報取得可能な状態
}
.addOnFailureListener {
if (exception is ResolvableApiException) {
// 設定変更をリクエスト
exception.startResolutionForResult(activity, REQUEST_CODE)
}
}
これは内部でstartIntentSenderForResultを呼び出しています。第二引数でリクエストコードを指定すればonActivityResultで結果を受け取ることもできます。
これで、アプリから離脱すること無く、ダイアログ上で設定を変更してもらうことができます。
以上です。

