在 Android 中,可以通过 Build.VERSION.SDK_INT
获取当前设备的 API 版本号(整数值),或通过 Build.VERSION.RELEASE
获取系统版本号的字符串表示(如 “11” 或 “R”)。
int apiLevel = Build.VERSION.SDK_INT; // 获取 API 版本号(整数) String versionName = Build.VERSION.RELEASE; // 获取系统版本号字符串
API Level | Android 版本 | 发布年份 |
---|---|---|
1 | 0 (Alpha) | 2008 |
4 | 6 Donut | 2009 |
8 | 2 Froyo | 2010 |
11 | 0 Honeycomb | 2011 |
16 | 1 Jelly Bean | 2012 |
21 | 0 Lollipop | 2014 |
23 | 0 Marshmallow | 2015 |
26 | 0 Oreo | 2017 |
28 | 0 Pie | 2018 |
30 | 0 Red Velvet | 2020 |
33 | 0 Tiramisu | 2022 |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21+ 专属代码(如使用 Material Design) } else { // 低版本兼容方案 }
某些类或方法仅在高版本中存在,需通过反射或条件判断加载:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 直接调用 API 24+ 的方法 } else { // 使用低版本兼容方案或反射 }
编译时检查 API 版本,但仍需运行时判断:
@RequiresApi(api = Build.VERSION_CODES.M) public void useFingerprint(Context context) { // 仅在 API 23+ 可用 }
避免直接调用高版本 API
在低版本设备上直接调用高版本 API 会抛出 NoClassDefFoundError
或 NoSuchMethodException
。
区分 SDK_INT 和 RELEASE
SDK_INT
是整数(如 30),用于程序逻辑判断。RELEASE
是字符串(如 “11”),用于界面显示或日志记录。测试覆盖多版本设备
不同厂商可能定制系统版本,需在真实设备或模拟器中测试。
解答:
使用 Build.VERSION.RELEASE
获取系统版本号(如 “11”),或结合 Build.DISPLAY
获取更详细的构建信息:
String fullVersion = Build.VERSION.RELEASE + " " + Build.DISPLAY; // "11 RP1A.201005.004"
解答:
通过反射加载高版本类,并处理 ClassNotFoundException
:
try { Class<?> highApiClass = Class.forName("android.app.admin.DevicePolicyManager"); // 使用反射调用方法 } catch (ClassNotFoundException e) { // 低版本无此类,提供替代方案 }