Я пишу код для поиска версии Android, как это
String version=Build.VERSION.RELEASE;
с помощью этого кода я получаю номер версии, но я хочу имя версии. как узнать название версии?
Я пишу код для поиска версии Android, как это
String version=Build.VERSION.RELEASE;
с помощью этого кода я получаю номер версии, но я хочу имя версии. как узнать название версии?
Как было предложено ранее, размышление, похоже, является ключом к этому вопросу. StringBuilder и дополнительное форматирование не требуются, он был добавлен только для иллюстрации использования.
import java.lang.reflect.Field;
...
StringBuilder builder = new StringBuilder();
builder.append("android : ").append(Build.VERSION.RELEASE);
Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
String fieldName = field.getName();
int fieldValue = -1;
try {
fieldValue = field.getInt(new Object());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
if (fieldValue == Build.VERSION.SDK_INT) {
builder.append(" : ").append(fieldName).append(" : ");
builder.append("sdk=").append(fieldValue);
}
}
Log.d(LOG_TAG, "OS: " + builder.toString());
На моем эмуляторе 4.1 я получаю этот вывод:
D/MainActivity( 1551): OS: android : 4.1.1 : JELLY_BEAN : sdk=16
Наслаждайтесь!
Оптимизированный код, это будет работать:
import java.lang.reflect.Field;
Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Log.d("Android OsName:",osName);
http://developer.android.com/reference/android/os/Build.VERSION_CODES.html содержит поля, которые имеют имя, которое вы ищете. Таким образом, вы можете использовать рефлексию, чтобы найти, какое поле соответствует значению "версия".
Зачем вам имя?
Вы получите информацию из этих
android.os.Build.VERSION_CODES
android.os.Build.VERSION.SDK_INT
Дополнительная информация может быть получена по этой ссылке:
Программный вывод версии программного обеспечения Android
Надеюсь, это поможет вам.
Проверьте это:
// Names taken from android.os.build.VERSION_CODES
String[] mapper = new String[] {
"ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
"ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", "GINGERBREAD",
"GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
"ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN"
};
int index = Build.VERSION.SDK_INT - 1;
String versionName = index < mapper.length? mapper[index] : "UNKNOWN_VERSION"; // > JELLY_BEAN)
Помните, что это решение будет работать только в том случае, если коды версий будут увеличиваться на единицу, и вам придется обновлять список каждой новой версией Android (если важно то, что важно).
Как описано в документации по Android, уровень SDK (целое число), на котором работает телефон, доступен в:
android.os.Build.VERSION.SDK_INT;
Перечисление, соответствующее этому int, находится в классе android.os.Build.VERSION_CODES.
Пример кода:
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO){
// Do something for froyo and above versions
} else{
// do something for phones running an SDK before froyo
}
Изменить: этот SDK_INT доступен с Donut (android 1.6/API4), поэтому убедитесь, что ваше приложение не ретро-совместимо с Cupcake (android 1.5/API3), когда вы его используете, или ваше приложение выйдет из строя (спасибо программисту Брюсу за точность).
import java.lang.reflect.Field;
Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Этот код будет работать. Затем просто используйте переменную osName, но вы хотите.
Отражение не работает, когда я попробовал в эмуляторе, работающем на API 19.
Поэтому я придумаю гибридный ответ "Начо Колома" и "Кевин Грант"
String osName="";
Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
String fieldName = field.getName();
int fieldValue = -1;
try {
fieldValue = field.getInt(new Object());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
if (fieldValue == Build.VERSION.SDK_INT) {
osName=fieldName; break;
}
}
if(osName.isEmpty()) {
String[] mapper = new String[]{
"ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
"ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO",
"GINGERBREAD", "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1",
"HONEYCOMB_MR2", "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN",
"JELLY_BEAN", "JELLY_BEAN", "KITKAT", "KITKAT",
"LOLLIPOOP", "LOLLIPOOP_MR1", "MARSHMALLOW", "NOUGAT",
"NOUGAT", "OREO", "OREO", "ANDROID P"};
int index = Build.VERSION.SDK_INT - 1;
osName = index < mapper.length ? mapper[index] : "UNKNOWN_VERSION";
}
Этот ответ обеспечивает более полные (полные) имена для "Зефира", но при этом остается перспективным на будущее, если вы не обновите свое приложение, когда выйдет новая версия (лучшая из обоих миров). Список названий версий отсюда.
String versionName =
Build.VERSION_CODES.class.getFields()[Build.VERSION.SDK_INT + 1].getName();
String[] versionNames = new String[]{
"ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
"ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", "GINGERBREAD",
"GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
"ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1",
"JELLY_BEAN", "JELLY_BEAN_MR1", "JELLY_BEAN_MR2", "KITKAT", "KITKAT_WATCH",
"LOLLIPOP", "LOLLIPOP_MR1", "MARSHMALLOW", "NOUGAT", "OREO", "OREO_MR1"
};
int nameIndex = Build.VERSION.SDK_INT - 1;
if (nameIndex < versionNames.length) {
versionName = versionNames[nameIndex];
}
Очевидно, что это производная от ответов других. По моему опыту, людям не нравится, когда вы пытаетесь изменить существующий ответ, чтобы улучшить его, поэтому я создаю новый.
Я применил решение выше, но не совсем доволен "O" и "N" в качестве имен версий, поэтому я внес некоторые изменения. Надеюсь, что это будет полезно и для других
/**
* Gets the version name from version code. Note! Needs to be updated
* when new versions arrive, or will return a single letter. Like Android 8.0 - Oreo
* yields "O" as a version name.
* @return version name of device OS
*/
private static String getOsVersionName() {
Field[] fields = Build.VERSION_CODES.class.getFields();
String name = fields[Build.VERSION.SDK_INT + 1].getName();
if(name.equals("O")) name = "Oreo";
if(name.equals("N")) name = "Nougat";
if(name.equals("M")) name = "Marshmallow";
if(name.startsWith("O_")) name = "Oreo++";
if(name.startsWith("N_")) name = "Nougat++";
return name;
}
Build.VERSION.SDK; возвращает правильный результат, но SDK устарел с API 16: Android 4.1 (Jelly Bean). поэтому он будет отображаться как w
После API 28 (Android Pie) в Build.VERSION_CODES были изменены некоторые поля.
Итак, если вы используете:
Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
немедленно вызовет сбой вашего приложения из-за исключения вне диапазона.
Решение для всех уровней API:
Field[] fields = Build.VERSION_CODES.class.getFields();
String codeName = "UNKNOWN";
for (Field field : fields) {
try {
if (field.getInt(Build.VERSION_CODES.class) == Build.VERSION.SDK_INT) {
codeName = field.getName();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Или в Kotlin со стилем Java 8:
val fields = Build.VERSION_CODES::class.java.fields
var codeName = "UNKNOWN"
fields.filter { it.getInt(Build.VERSION_CODES::class) == Build.VERSION.SDK_INT }
.forEach { codeName = it.name }
Вы можете попробовать следующую функцию.
public String AndroidOSName() {
String os = Build.VERSION.SDK;
System.out.println("here is my os" + " " + os);
if (os.equals("23")) {
return "Marshmallow";
} else if (os.equals("21")) {
return "Lollipop";
} else if (os.equals("22")) {
return "LOLLIPOP_MR1";
} else if (os.equals("20")) {
return "KitKat";
} else if (os.equals("19")) {
return "KitKat";
} else if (os.equals("18")) {
return "Jelly Bean";
} else if (os.equals("17")) {
return "Jelly Bean";
} else if (os.equals("16")) {
return "Jelly Bean";
} else if (os.equals("15")) {
return "Ice Cream Sandwich";
} else if (os.equals("14")) {
return "Ice Cream Sandwich";
} else if (os.equals("13")) {
return "Honeycomb";
} else if (os.equals("12")) {
return "Honeycomb";
} else if (os.equals("11")) {
return "Honeycomb";
} else if (os.equals("10")) {
return "Gingerbread";
} else if (os.equals("9")) {
return "Froyo";
} else if (os.equals("8")) {
return "Froyo";
} else {
return "Not Found";
}
}