【发布时间】:2011-03-26 07:45:53
【问题描述】:
有没有办法获取手机当前运行的API版本?
【问题讨论】:
标签: android android-api-levels
有没有办法获取手机当前运行的API版本?
【问题讨论】:
标签: android android-api-levels
如 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),否则您的应用程序将崩溃(感谢程序员 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 的问题是,如果你有一个 root 手机或自定义 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(不是整数)返回 NULL? NULL 是对象的状态,因此理论上它的 Build 或 VERSION 可能是 null,但在这种情况下,不仅 SDK_INT,而且 RELEASE 也会导致 NPE。 SDK_INT 可能会导致“没有这样的方法异常”或类似的东西,但不是 null 或 NPE。如果只有自定义 ROM 会破坏文档和声明为 public static final Integer SDK_INT 的方法。我只是想确定问题的性质以解决问题。
null 的警告没有意义。
试试这个:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
【讨论】:
综合考虑,这里是我用来检测设备是否有 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;
}
显然,您可以修改 if 条件以考虑 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;
}
}
如果代码不适合你,请告诉我。
【讨论】:
android.os.Build.VERSION.SDK 应该为您提供 API 级别的值。您可以在 android 文档中轻松找到从 api 级别到 android 版本的映射。我相信,8 代表 2.2,7 代表 2.1,依此类推。
【讨论】:
SDK.INT 支持 Android 1.6 及更高版本
所有版本
都支持SDK所以我这样做:
String sdk_version_number = android.os.Build.VERSION.SDK;
【讨论】:
知道了。它使用Context 类的getApplicationInfo() 方法。
【讨论】:
我一般更喜欢在函数中添加这些代码来获取Android版本:
int whichAndroidVersion;
whichAndroidVersion= Build.VERSION.SDK_INT;
textView.setText("" + whichAndroidVersion); //If you don't use "" then app crashes.
例如,上面的代码现在会将我的 textView 中的文本设置为“29”。
【讨论】:
我更喜欢将版本作为数字处理,比我写的更容易:
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;
}
【讨论】:
像这样:
String versionRelease = BuildConfig.VERSION_NAME;
versionRelease :- 2.1.17
请确保您的导入包正确(import package your_application_package_name,否则将无法正常工作)。
【讨论】: