Как я могу проверить системную версию Android?

494

Кто-нибудь знает, как можно программно проверить версию системы (например 1.0, 2.2и т. Д.)?

ДАВС
источник
есть ли ярлык (фрагмент кода или живой шаблон) для добавления этой проверки в android studio
Basheer AL-MOMANI

Ответы:

420

Проверьте android.os.Build.VERSION.

  • CODENAME: Текущее кодовое имя разработки или строка «REL», если это сборка выпуска.
  • INCREMENTALВнутреннее значение, используемое базовым источником контроля для представления этой сборки.
  • RELEASE: Видимая пользователем строка версии.
Робби Понд
источник
72
какие-нибудь примеры о том, как его использовать?
Джонатан
1
Сложность в том, что SDK_INT был определен на уровне API 4, и его использование не удается 1-3. Кто-нибудь знает, как с этим справиться?
Зордид
SDK доступен начиная с API 1, также INCREMENTAL доступен для всех версий.
Нуала
1
Build.VERSION.RELEASE - это строка, поэтому вы можете использовать эту строку так, как вам нравится.
Пайего
8
Не волнуйтесь, даже пещерные люди сегодня не используют API Android 1-3. @Zordid
Джош
811

Пример как это использовать:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Атом
источник
24
Я полностью игнорирую любую более старую версию, чем Eclair (7), Android 2.1, и очень скоро мы прекращаем поддержку 2.1. Но вы можете использовать SDK вместо SDK_INT.
ATom
12
SDK был определен на уровне API 4. Вместо этого используйте SDK_INT.
Эрдоместер
У меня есть вопрос: если он работает в системе старше GINGERBREAD, то мы не можем получить android.os.Build.VERSION_CODES.GINGERBREAD, произойдет ли сбой приложения?
HongchaoZhang
Нет, потому что GINGERBREAD будет заменен только номером во время сборки Java. Нужно использовать только большую версию Android.
ATom
97

Build.Version - это место для получения этих данных. Вот фрагмент кода для его форматирования.

public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

Похоже, это "Android SDK: 19 (4.4.4)"

jpotts18
источник
63
Build.VERSION.RELEASE;

Это даст вам фактические номера вашей версии; ака 2.3.3 или 2.2. Проблема с использованием Build.VERSION.SDK_INT заключается в том, что если у вас есть рутированный телефон или пользовательский rom, у вас может быть не стандартная ОС (она же мой android под управлением 2.3.5), и она будет возвращать ноль при использовании Build.VERSION.SDK_INT так что Build.VERSION.RELEASE будет работать несмотря ни на что!

Falcon165o
источник
Из SDK: «Пользовательская строка версии. Например,« 1.0 »или« 3.4b5 ».» .... "3.4b5", как я могу определить, какой это номер версии?
Давс
Полный ответ 2.3.3 - это номер версии, или 2.2, или 2.3.5 (custom rom в моем случае). Это номер версии ОС в целом.
Falcon165o
Возвращает тоже самое Меню >> Настройки >> О телефоне. Он должен быть помечен как Версия прошивки или что-то подобное.
Falcon165o
58
Как, черт возьми, int может вернуть ноль? SDK_INT является примитивом int.
Жолт Сафрани
57

Для проверки версии устройства, которая больше или равна Зефиру, используйте этот код.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){

    }

для взлома других просто измените VERSION_CODES, например,
K для kitkat,
L для loolipop N для Nougat и так далее ...

paulcab
источник
48

Вы можете узнать версию Android, глядя на Build.VERSION.

Документация рекомендует проверять Build.VERSION.SDK_INTзначения в Build.VERSION_CODES.

Это нормально, если вы понимаете, что он Build.VERSION.SDK_INTбыл представлен только в API Level 4, то есть Android 1.6 (Donut). Так что это не повлияет на вас, но если вы хотите, чтобы ваше приложение работало на Android 1.5 или более ранней версии, вам придется использовать устаревшую версию Build.VERSION.SDK.

Дэйв Уэбб
источник
30

Я не могу комментировать ответы, но в ответе Каушика есть огромная ошибка: SDK_INT не совпадает с версией системы, но на самом деле относится к уровню API.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    //this code will be executed on devices running ICS or later
}

Значение Build.VERSION_CODES.ICE_CREAM_SANDWICHравно 14. 14 - уровень API Ice Cream Sandwich, в то время как системная версия - 4.0. Поэтому, если вы напишите 4.0, ваш код будет выполняться на всех устройствах, начиная с Donut, потому что 4 - это уровень API Donut ( Build.VERSION_CODES.DONUTравен 4).

if(Build.VERSION.SDK_INT >= 4.0){
    //this code will be executed on devices running on DONUT (NOT ICS) or later
}

Этот пример является причиной, по которой использование «магического числа» является вредной привычкой.

Михал Кисел
источник
7
На самом деле Build.VERSION.SDK_INT - это уровень API, а не код версии. Таким образом, правильная линия будетif(Build.VERSION.SDK_INT >= 15){
erdomester
Что если я сказал, что код версии совпадает с уровнем API, а SDK_INT для ICE_CREAM_SANDWICH - 14, а не 15? @erdomester
Бейондо
19

Например, функция работает только для api21 вверх, ниже мы исправляем ошибки в api21 down

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }
Хошьяр Ахмадпур
источник
19

Имейте в виду, что Build.VERSION.SDK_INT не надежен, он упоминается @ Falcon165o, и недавно я тоже столкнулся с ним.

Итак, чтобы получить данные String (на основе списка версий Android ) для установленного в настоящее время Android, я сделал код, подобный следующему:

Ява

//Current Android version data
public static String currentVersion(){
    double release=Double.parseDouble(Build.VERSION.RELEASE.replaceAll("(\\d+[.]\\d+)(.*)","$1"));
    String codeName="Unsupported";//below Jelly bean OR above Oreo
    if(release>=4.1 && release<4.4)codeName="Jelly Bean";
    else if(release<5)codeName="Kit Kat";
    else if(release<6)codeName="Lollipop";
    else if(release<7)codeName="Marshmallow";
    else if(release<8)codeName="Nougat";
    else if(release<9)codeName="Oreo";
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

Котлин

fun currentVersion(): String {
    val release = java.lang.Double.parseDouble(java.lang.String(Build.VERSION.RELEASE).replaceAll("(\\d+[.]\\d+)(.*)", "$1"))
    var codeName = "Unsupported"//below Jelly bean OR above Oreo
    if (release >= 4.1 && release < 4.4)  codeName = "Jelly Bean"
    else if (release < 5) codeName = "Kit Kat"
    else if (release < 6) codeName = "Lollipop"
    else if (release < 7) codeName = "Marshmallow"
    else if (release < 8) codeName = "Nougat"
    else if (release < 9) codeName = "Oreo"
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

Пример вывода, который он производит:

Зефир v6.0, уровень API: 23

Никита Куртин
источник
1
Этот код вылетает в Double.parseDouble (Build.VERSION.RELEASE), когда релиз содержит более одной точки. Например 7.1.1
Миклош
@ MiklósKeresztes Спасибо за содержательный комментарий - я исправил свой ответ.
Никита Куртин
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Кункун Лю
источник
Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
abarisone
3

использовать этот класс

import android.os.Build;

/**
 * Created by MOMANI on 2016/04/14.
 */
public class AndroidVersionUtil {
    public static int getApiVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }

    public static boolean isApiVersionGraterOrEqual(int thisVersion) {
        return android.os.Build.VERSION.SDK_INT >= thisVersion;
    }
}
Башир Аль-Момани
источник
3

Используйте этот метод:

 public static String getAndroidVersion() {
        String versionName = "";

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }
Маной Таркар
источник
Как это поможет?
Самуэль Овино
1

Учитывая, что у вас есть bashна вашем устройстве Android, вы можете использовать эту функцию bash:

function androidCodeName {
    androidRelease=$(getprop ro.build.version.release)
    androidCodeName=$(getprop ro.build.version.codename)

    # Time "androidRelease" x10 to test it as an integer
    case $androidRelease in
        [0-9].[0-9]|[0-9].[0-9].|[0-9].[0-9].[0-9])  androidRelease=$(echo $androidRelease | cut -d. -f1-2 | tr -d .);;
        [0-9].) androidRelease=$(echo $androidRelease | sed 's/\./0/');;
        [0-9]) androidRelease+="0";;
    esac

    [ -n "$androidRelease" ] && [ $androidCodeName = REL ] && {
    # Do not use "androidCodeName" when it equals to "REL" but infer it from "androidRelease"
        androidCodeName=""
        case $androidRelease in
        10) androidCodeName+=NoCodename;;
        11) androidCodeName+="Petit Four";;
        15) androidCodeName+=Cupcake;;
        20|21) androidCodeName+=Eclair;;
        22) androidCodeName+=FroYo;;
        23) androidCodeName+=Gingerbread;;
        30|31|32) androidCodeName+=Honeycomb;;
        40) androidCodeName+="Ice Cream Sandwich";;
        41|42|43) androidCodeName+="Jelly Bean";;
        44) androidCodeName+=KitKat;;
        50|51) androidCodeName+=Lollipop;;
        60) androidCodeName+=Marshmallow;;
        70|71) androidCodeName+=Nougat;;
        80|81) androidCodeName+=Oreo;;
        90) androidCodeName+=Pie;;
        100) androidCodeName+=ToBeReleased;;
        *) androidCodeName=unknown;;
        esac
    }
    echo $androidCodeName
}
SebMa
источник