Ответ 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;
}