以编程方式检索Android API版本


Answers:


1066

如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)不兼容,否则您的应用程序将崩溃(感谢Programmer Bruce提供的精度) 。

相应的android文档在这里这里


18
如果代码在1.5上运行,则引用SDK_INT将引发异常,因为它是API 4引入的。(是的,您可以在1.5上运行使用API​​ 4代码编译的APK。是的,当到达该API 4代码时,它的确会引发异常。)
程序员布鲁斯(Bruce

@ProgrammerBruce如何防止崩溃?还是兼容复古?
心教堂

1
@Cœur我认为现在构建与Android 1.5兼容的复古应用程序并不是真正有用。只需将项目设置minSdkVersion4(Android 1.6)并继续即可。
ol_v_er

为什么不改用String android.os.Build.VERSION.SDK?它适用于所有Android版本
PYK

@PYK该属性android.os.Build.VERSION.SDK已被弃用,因此不应使用。developer.android.com/reference/android/os/…–
ol_v_er

146

很容易:

   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

2
Build.VERSION.RELEASE是我一直在寻找的东西。感谢@CommonSenseCode
axierjhtjz 19-3-20

81
Build.VERSION.RELEASE;

这样可以为您提供实际的版本号;又名2.3.3或2.2。使用Build.VERSION.SDK_INT的问题是,如果您拥有一部扎根的手机或自定义rom,则可能具有非标准操作系统(又名我的android系统正在运行2.3.5),并且在使用Build.VERSION.SDK_INT时将返回null因此,无论是否使用标准Android版本,Build.VERSION.RELEASE都可以工作!

要使用它,您可以这样做。

String androidOS = Build.VERSION.RELEASE;

9
根据文档int android.os.Build.VERSION.SDK_INTpublic static final int SDK_INT以及 Added in API level 4int(不是Integer)如何返回NULLNULL是一个状态的对象,以便其构建或版本可以被null理论上但在这种情况下,不仅SDK_INTRELEASE也将导致NPE。SDK_INT可能会导致“无此类方法异常”或类似的情况,但不会导致null或NPE。如果仅自定义ROM破坏了文档和声明为的方法public static final Integer SDK_INT。我只是想确定问题的性质以进行解决。
斯坦(Stan)

3
任何人都可以验证是否确实如此吗?斯坦的评论清楚地表明,不可能为null。而且自定义Android ROM / OS是否一定要源自某个版本的版本?因此,确定Build.VERSION.SDK_INT应该可以反映这一点吗?
英国电信

3
我对此表示反对,因为该声明没有得到真正的支持,并且警告null也没有意义。
山姆

根植的电话或自定义rom绝对不要触摸此号码。他们通常会更改Build.VERSION.RELEASE。
Phuah Yee Keat

自定义OS / Roms涉及很多已知问题。我当时在较旧的Android上使用的版本(我想说GS3)遇到了这个问题。硬编码值或不仅仅正确的值存在很多问题。举例来说,Wi-Fi Mac地址是经过硬编码的。
Falcon165o

31

考虑到所有人,这是我用来检测设备是否具有Froyo或更新的Android OS(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;
}

显然,如果需要通用检查器,可以修改条件,以考虑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;
    }
}

让我知道代码是否对您不起作用。



9

android.os.Build.VERSION.SDK应该为您提供API级别的值。您可以在android文档中轻松找到从api级别到android版本的映射。我相信,8代表2.2,7代表2.1,依此类推。


不建议使用此方法。
阿迪

4

得到它了。它使用类的getApplicationInfo()方法Context


1
这将为您提供APK的minSdkVersion和targetSdkVersion,它们描述了该应用程序支持的API版本。这不是该应用当前正在运行的手机的API版本。
OldSchool4664 '16


0

我更喜欢使用版本号来编写代码,而不是我这样写:

  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();
}

0

其工作愉快的编码

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

注意请确保您的导入软件包正确(导入软件包为您的应用程序软件包名称,否则将无法正常工作)


-2

我改进了我使用的代码

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.