Диалог LocationSettings Появляется, даже если GPS включен - PullRequest
4 голосов
/ 03 апреля 2019
val request = LocationRequest()
    request.interval = 1000 * 60
    request.fastestInterval = 1000 * 30
    request.smallestDisplacement = 10f
    request.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

    val builder = LocationSettingsRequest.Builder().addLocationRequest(request)
    builder.setAlwaysShow(true)
    val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())
    result.addOnFailureListener {
        if (it is ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                it.startResolutionForResult(this, 1)
            } catch (sendEx: IntentSender.SendIntentException) {
                // Ignore the error.
            }

        }

    }

Выше код предназначен для того, чтобы попросить пользователя включить местоположение. Но недавно я обнаружил, что некоторое время он просит включить местоположение, даже если оно включено.

РЕДАКТИРОВАТЬ: 1 Недавно я обнаружил, что если на устройстве включен режим экономии заряда батареи или настройка точности определения местоположения устройства НИЗКАЯ, этот запрос не выполняется с тем же кодом состояния.

1 Ответ

2 голосов
/ 15 апреля 2019

В OnFailureListener вы можете дополнительно проверить, включен или выключен GPS, а затем показать диалог пользователя.что-то вроде этого:

result.addOnFailureListener {
    if (it is ResolvableApiException) {
        try {
           val lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
           val gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

           if(!gps_enabled) {
               it.startResolutionForResult(this, 1)
           } else {
               powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
               val locationMode = Settings.Secure.getInt(activityUnderTest.getContentResolver(), Settings.Secure.LOCATION_MODE)

            // location mode status:
            //  0 = LOCATION_MODE_OFF
            //  1 = LOCATION_MODE_SENSORS_ONLY
            //  2 = LOCATION_MODE_BATTERY_SAVING
            //  3 = LOCATION_MODE_HIGH_ACCURACY

               if(powerManager.powerSaverMode) {
                   //show dialog to turn off the battery saver mode
               } else if (locationMode != 3){
                  //show dialog that "make sure your location accuracy is not low"
               }
           }
        } catch (sendEx: Exception) {
            // Ignore the error.
        }

    }

}

Помните, что вам нужно будет добавить следующие разрешения в файл манифеста.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...