Как проверить, включено ли местоположение и приоритет в API 18 и ниже

Пробовал это:

String locationProviders = Settings.Secure.getString(getActivity().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
Log.d(TAG_MAP, locationProviders);

Выход: gps, network

Есть ли телефоны с API 18 и ниже, не имеют приоритета HIGH_ACCURACY?

Ответ 1

Я предполагаю, что вам интересно, как использование Settings.Secure.LOCATION_PROVIDERS_ALLOWED, которое лишено уровня API 19, отличается от использования Settings.Secure.LOCATION_MODE, которое было введено в API-интерфейсе 19.

С Settings.Secure.LOCATION_MODE у вас есть эти значения (вы, вероятно, уже знаете это):

LOCATION_MODE_HIGH_ACCURACY, LOCATION_MODE_SENSORS_ONLY, LOCATION_MODE_BATTERY_SAVING или LOCATION_MODE_OFF

Вы можете сопоставить эти значения с Settings.Secure.LOCATION_PROVIDERS_ALLOWED следующим образом:

LOCATION_MODE_HIGH_ACCURACY: "gps, network"

LOCATION_MODE_SENSORS_ONLY: "gps"

LOCATION_MODE_BATTERY_SAVING: "сеть"

LOCATION_MODE_OFF: ""

Обратите внимание, что в коде лучше всего ссылаться на константы LocationManager.GPS_PROVIDER и LocationManager.NETWORK_PROVIDER вместо "gps" и "network".

Используя этот ответ в качестве ссылки, вы можете сделать что-то вроде этого:

public static int getLocationMode(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

        } catch (SettingNotFoundException e) {
            e.printStackTrace();
        }


    } else {
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (TextUtils.isEmpty(locationProviders)) {
          locationMode = Settings.Secure.LOCATION_MODE_OFF;
        }
        else if (locationProviders.contains(LocationManager.GPS_PROVIDER) && locationProviders.contains(LocationManager.NETWORK_PROVIDER)) {
          locationMode = Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
        }
        else if (locationProviders.contains(LocationManager.GPS_PROVIDER)) {
           locationMode = Settings.Secure.LOCATION_MODE_SENSORS_ONLY;
        }
        else if (locationProviders.contains(LocationManager.NETWORK_PROVIDER)) {
           locationMode = Settings.Secure.LOCATION_MODE_BATTERY_SAVING;
        }

    }

    return locationMode;
} 

Ответ 2

Вы можете использовать эту функцию. Я тестировал API 21 и API 16

public static boolean checkHighAccuracyLocationMode(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        //Equal or higher than API 19/KitKat
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
            if (locationMode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY){
                return true;
            }
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
    }else{
        //Lower than API 19
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (locationProviders.contains(LocationManager.GPS_PROVIDER) && locationProviders.contains(LocationManager.NETWORK_PROVIDER)){
            return true;
        }
    }
    return false;
}

Помните, что режим HIGH_ACCURACY означает, что пользователь GPS и сетевой провайдер включены. В противном случае эта функция вернет false.