以编程方式检索Android API版本

Par*_*hta 556 android android-api-levels

有没有办法获得手机当前运行的API版本?

ol_*_*_er 1036

如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
}
Run Code Online (Sandbox Code Playgroud)

编辑:此SDK_INT自Donut(Android 1.6/API4)开始提供,因此请确保您的应用程序与Cupcake(Android 1.5/API3)不兼容时使用它或您的应用程序将崩溃(感谢Programmer Bruce的精确度) .

相应的android文档就在这里这里

  • 如果代码在1.5上运行,那么引用SDK_INT将引发异常,因为它是在API 4中引入的.(是的,您可以运行在1.5上使用API​​ 4代码编译的APK.是的,当达到API 4代码时,它确实抛出异常.) (17认同)
  • @Cœur 我认为构建与 Android 1.5 兼容的应用程序现在并不是很有用。只需将您的项目 `minSdkVersion` 设置为 `4`(Android 1.6)然后继续。 (2认同)

Com*_*ode 132

很容易:

   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
    );
Run Code Online (Sandbox Code Playgroud)

输出:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
Run Code Online (Sandbox Code Playgroud)

  • Build.VERSION.RELEASE是我一直在寻找的东西。谢谢@CommonSenseCode (2认同)

Fal*_*65o 79

Build.VERSION.RELEASE;
Run Code Online (Sandbox Code Playgroud)

这将为您提供您的版本的实际数字; 又名2.3.3或2.2.使用Build.VERSION.SDK_INT的问题是,如果你有一个root的手机或自定义ROM,你可能有一个非标准的操作系统(也就是我的android运行2.3.5),当使用Build.VERSION.SDK_INT时将返回null所以无论使用标准的Android版本,Build.VERSION.RELEASE都能正常工作!

要使用它,你可以这样做;

String androidOS = Build.VERSION.RELEASE;
Run Code Online (Sandbox Code Playgroud)

  • 根据文档`int android.os.Build.VERSION.SDK_INT`和`public static final int SDK_INT`和`在API级别4中添加`,int(不是Integer)如何返回`NULL`?`NULL`是一个对象的状态,因此它的Build或VERSION理论上可以是'null`,但在这种情况下,不仅`SDK_INT`而且`RELEASE`也会导致NPE.SDK_INT可能导致"没有这样的方法异常"或类似但不是null或NPE.如果只有自定义ROM会破坏文档和声明为`public static final Integer SDK_INT`的方法.我只是想确定问题的本质来制定解决方法. (7认同)
  • 任何人都可以验证这是否确实如此?斯坦的评论很清楚,null是不可能的.自定义Android ROM的/ OS肯定要来自某些版本的版本?那么Build.VERSION.SDK_INT肯定应该反映出来吗? (3认同)
  • 我已经低估了这个,因为索赔没有真正备份,关于"null"的警告没有意义. (3认同)

nik*_*3ro 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;
}
Run Code Online (Sandbox Code Playgroud)

显然,如果您需要通用检查器,可以修改if条件以考虑1.0和1.5版本的Android.你可能会得到这样的东西:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果代码不适合您,请告诉我.


Kha*_*aha 23

试试这个:

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


jvd*_*ste 9

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


PYK*_*PYK 5

Android 1.6及更高版本支持 SDK.INT

所有版本均支持 SDK

所以我这样做:

String sdk_version_number = android.os.Build.VERSION.SDK;
Run Code Online (Sandbox Code Playgroud)

归功于CommonsWare在这个答案上


Par*_*hta 3

知道了。它使用类getApplicationInfo()的方法Context

  • 这将为您提供 APK 的 minSdkVersion 和 targetSdkVersion,它们描述了应用程序支持的 API 版本。这不是应用程序当前运行的手机的 API 版本。 (3认同)