Есть ли способ получить версию API, на которой сейчас работает телефон?
Получение версии Android API программным способом
Ответы (12)
Как описано в документации Android, уровень SDK (целое число), на котором работает телефон, доступен в:
android.os.Build.VERSION.SDK_INT
Класс, соответствующий этому int, находится в классе android.os.Build.VERSION_CODES
.
Пример кода:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
// Do something for lollipop and above versions
} else{
// do something for phones running an SDK before lollipop
}
Изменить: этот SDK_INT доступен начиная с Donut (android 1.6 / API4), поэтому убедитесь, что ваше приложение не поддерживает ретро-совместимость с Cupcake (android 1.5 / API3), когда вы его используете, иначе ваше приложение выйдет из строя (спасибо Программисту Брюсу за точность).
Соответствующая документация по Android находится здесь и здесь
minSdkVersion
значение 4
(Android 1.6) и продолжайте.
- person ol_v_er; 08.01.2019
Очень просто:
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
int version = Build.VERSION.SDK_INT;
String versionRelease = Build.VERSION.RELEASE;
Log.e("MyActivity", "manufacturer " + manufacturer
+ " \n model " + model
+ " \n version " + version
+ " \n versionRelease " + versionRelease
);
Выход:
E/MyActivity: manufacturer ManufacturerX
model SM-T310
version 19
versionRelease 4.4.2
Build.VERSION.RELEASE;
Это даст вам фактические номера вашей версии; он же 2.3.3 или 2.2. Проблема с использованием Build.VERSION.SDK_INT заключается в том, что если у вас есть рутированный телефон или пользовательский ROM, у вас может быть нестандартная ОС (например, мой Android работает под управлением 2.3.5), и при использовании Build.VERSION.SDK_INT будет возвращено значение null. поэтому Build.VERSION.RELEASE будет работать независимо от того, используется стандартная версия Android или нет!
Чтобы использовать это, вы можете просто сделать это;
String androidOS = Build.VERSION.RELEASE;
int android.os.Build.VERSION.SDK_INT
, public static final int SDK_INT
и Added in API level 4
, как int (не Integer) может возвращать NULL
? NULL
- это состояние объекта, поэтому его Сборка или ВЕРСИЯ может быть null
теоретически, но в таком случае не только SDK_INT
, но и RELEASE
вызовут NPE. SDK_INT, вероятно, может вызвать исключение такого метода или что-то в этом роде, но не null или NPE. Если только пользовательское ПЗУ нарушает документацию и метод, объявленный как public static final Integer SDK_INT
. Я просто пытаюсь определить характер проблемы, чтобы найти обходной путь.
- person Stan; 05.09.2013
null
не имеет смысла.
- person Sam; 26.12.2014
попробуй это:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
Принимая во внимание все сказанное, вот код, который я использую для определения, есть ли на устройстве Froyo или более новая ОС Android (2.2+):
public static boolean froyoOrNewer() {
// SDK_INT is introduced in 1.6 (API Level 4) so code referencing that would fail
// Also we can't use SDK_INT since some modified ROMs play around with this value, RELEASE is most versatile variable
if (android.os.Build.VERSION.RELEASE.startsWith("1.") ||
android.os.Build.VERSION.RELEASE.startsWith("2.0") ||
android.os.Build.VERSION.RELEASE.startsWith("2.1"))
return false;
return true;
}
Очевидно, вы можете изменить это условие if, чтобы учесть версии Android 1.0 и 1.5 на случай, если вам понадобится универсальная программа проверки. Вы, вероятно, получите что-то вроде этого:
// returns true if current Android OS on device is >= verCode
public static boolean androidMinimum(int verCode) {
if (android.os.Build.VERSION.RELEASE.startsWith("1.0"))
return verCode == 1;
else if (android.os.Build.VERSION.RELEASE.startsWith("1.1")) {
return verCode <= 2;
} else if (android.os.Build.VERSION.RELEASE.startsWith("1.5")) {
return verCode <= 3;
} else {
return android.os.Build.VERSION.SDK_INT >= verCode;
}
}
Сообщите мне, если код вам не подходит.
android.os.Build.VERSION.SDK должен предоставить вам значение уровня API. Вы можете легко найти сопоставление уровня api с версией Android в документации по Android. Я считаю, что 8 - это 2.2, 7 - 2.1 и так далее.
SDK.INT поддерживается для Android 1.6 и более поздних версий.
SDK поддерживается для всех версий
So I do:
String sdk_version_number = android.os.Build.VERSION.SDK;
Кредиты для: CommonsWare по этому ответ
Понятно. Он использует метод getApplicationInfo()
класса Context
.
Обычно я предпочитаю добавлять эти коды в функцию для получения версии Android:
int whichAndroidVersion;
whichAndroidVersion= Build.VERSION.SDK_INT;
textView.setText("" + whichAndroidVersion); //If you don't use "" then app crashes.
Например, этот код выше установит текст в моем textView как 29.
Я предпочитаю, чтобы номер версии был более простым, чем я написал это:
public static float getAPIVerison() {
Float f = null;
try {
StringBuilder strBuild = new StringBuilder();
strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
f = new Float(strBuild.toString());
} catch (NumberFormatException e) {
Log.e("", "error retriving api version" + e.getMessage());
}
return f.floatValue();
}
Я улучшил код, который использовал
public static float getAPIVerison() {
float f=1f;
try {
StringBuilder strBuild = new StringBuilder();
strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
f= Float.valueOf(strBuild.toString());
} catch (NumberFormatException e) {
Log.e("myApp", "error retriving api version" + e.getMessage());
}
return f;
}
Нравится:
String versionRelease = BuildConfig.VERSION_NAME;
versionRelease :- 2.1.17
Убедитесь, что ваш импортный пакет правильный (import package your_application_package_name
, иначе он не будет работать должным образом).