如何检查Android系统的版本?

588

有人知道如何以编程方式检查系统版本(例如1.0、2.2等)吗?


在Android Studio中是否有快捷方式(代码片段或实时模板)可以添加此检查? - Basheer AL-MOMANI
14个回答

924

如何使用的示例:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}

24
我只关注安卓2.1版本及以上的版本,比如爱克莱尔(7),而且我们即将停止对2.1版本的支持。但你可以使用SDK而不是SDK_INT。 - ATom
15
SDK已在API级别4中被弃用,请使用SDK_INT代替。 - erdomester
1
我有一个问题:如果它运行在比 GINGERBREAD 更早的系统上,那么我们无法获取android.os.Build.VERSION_CODES.GINGERBREAD,应用程序会崩溃吗? - HongchaoZhang
1
不需要,因为在Java构建期间,GINGERBREAD将被数字替换。只需要使用更大的Android编译版本即可。 - ATom
由于某些原因,我得到了“未解决的引用:清单”错误。 - Ayxan Haqverdili

460

请查看android.os.Build.VERSION

  • CODENAME: 当前开发代号,如果是发布版则为字符串"REL"。
  • INCREMENTAL: 底层源代码控制所使用的内部值来表示此版本。
  • RELEASE: 用户可见的版本号字符串。

92
如何使用它的任何示例? - Jono
1
这个问题的难点在于SDK_INT已经在API Level 4中定义,而在1-3上使用它会失败。有人知道如何优雅地处理这个问题吗? - Zordid
SDK自API 1版本起可用,所有版本都可使用INCREMENTAL。 - nuala
1
Build.VERSION.RELEASE是一个String,因此您可以按照自己的意愿使用这个字符串。 - paiego
13
不用担心,就连穴居人今天也不再使用Android API 1-3。@Zordid - Josh
可用的仅有 RELEASE,它的值为 9 - kenjiuno

132

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)"


86

要检查设备版本是否大于或等于Marshmallow,请使用此代码。

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

    }

要检查其他版本,只需更改 VERSION_CODES,例如:
K 代表 KitKat,
L 代表 Lollipop,
N 代表 Nougat 等等...


68
Build.VERSION.RELEASE;
那将给您版本的实际数字; 即 2.3.3 或 2.2。 使用 Build.VERSION.SDK_INT 的问题在于,如果您有一个rooted手机或自定义ROM,则可能有一个非标准操作系统(也就是我的安卓正在运行2.3.5),使用 Build.VERSION.SDK_INT 将返回null,因此 Build.VERSION.RELEASE 将始终有效!

来自SDK:“用户可见的版本字符串,例如“1.0”或“3.4b5”。”…“3.4b5”我怎么确定它是哪个版本号? - davs
整个答案2.3.3是版本号,或者是2.2,或者是2.3.5(在我的情况下是自定义ROM)。那就是整个操作系统的版本号。 - Falcon165o
它返回相同的菜单>>设置>>关于手机。它应该被标记为固件版本或类似的内容。 - Falcon165o
61
一个原始的int类型怎么可能返回null? SDK_INT是一个原始的int类型。 - Zsolt Safrany

50

您可以查看Build.VERSION来了解Android版本。

文档建议您将Build.VERSION.SDK_INTBuild.VERSION_CODES中的值进行比较。

只要您意识到Build.VERSION.SDK_INT仅在API Level 4中引入,也就是Android 1.6 (Donut)。这不会影响您使用,但如果您想让您的应用程序运行在Android 1.5或更早的版本上,则必须使用已弃用的Build.VERSION.SDK代替。


37

我无法评论这些答案,但Kaushik的答案中有一个巨大的错误: 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级别,而系统版本是4.0。因此,如果你写4.0,你的代码将在从甜甜圈开始的所有设备上执行,因为4是甜甜圈的API级别(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
}

这个例子说明为什么使用“魔数”是一个不好的习惯。


8
实际上,Build.VERSION.SDK_INT代表的是API级别,而不是版本号。因此,正确的代码应该是 if(Build.VERSION.SDK_INT >= 15){ - erdomester
如果我告诉你版本代码与API级别相同,而ICE_CREAM_SANDWICH的SDK_INT是14而不是15,你会怎么想? @erdomester - Beyondo

29

请注意,Build.VERSION.SDK_INT并不可靠,正如@Falcon165o所述,我最近也遇到了这个问题。

因此,为了获取当前安装的Android系统的字符串数据(基于Android版本列表),我编写了以下代码:

Java

//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
    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";
    else if(release < 10)  codeName="Pie";
    else if(release >= 10) codeName="Android "+((int)release);//since API 29 no more candy code names
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

Kotlin

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
    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"
    else if (release < 10)  codeName = "Pie"
    else if (release >= 10) codeName = "Android "+(release.toInt())//since API 29 no more candy code names
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

它所产生的输出示例:

Marshmallow v6.0,API级别:23


1
当版本号包含多个点时,例如7.1.1,此代码在Double.parseDouble(Build.VERSION.RELEASE)处崩溃。 - Miklós Keresztes
@MiklósKeresztes 感谢您的有益评论 - 我已经修正了我的答案。 - Nikita Kurtin

27
例如,某个功能仅适用于API级别21及以上,我们修复了API级别21及以下的错误。
    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }

7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接