有什么方法可以获取手机当前正在运行的API版本?
有什么方法可以获取手机当前正在运行的API版本?
Answers:
如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提供的精度) 。
minSdkVersion
为4
(Android 1.6)并继续即可。
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
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;
int android.os.Build.VERSION.SDK_INT
, public static final int SDK_INT
以及 Added in API level 4
int(不是Integer)如何返回NULL
?NULL
是一个状态的对象,以便其构建或版本可以被null
理论上但在这种情况下,不仅SDK_INT
但RELEASE
也将导致NPE。SDK_INT可能会导致“无此类方法异常”或类似的情况,但不会导致null或NPE。如果仅自定义ROM破坏了文档和声明为的方法public static final Integer SDK_INT
。我只是想确定问题的性质以进行解决。
null
也没有意义。
考虑到所有人,这是我用来检测设备是否具有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;
}
}
让我知道代码是否对您不起作用。
尝试这个:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
得到它了。它使用类的getApplicationInfo()
方法Context
。
我更喜欢使用版本号来编写代码,而不是我这样写:
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();
}
我改进了我使用的代码
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;
}