如何以编程方式查找Android版本名称?

Ven*_*kat 22 android android-ndk

我编写代码来查找这样的Android版本

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

通过使用此代码我得到版本号但我想要版本名称.如何获取版本名称?

Kev*_*ant 52

如前所述,反思似乎是这个问题的关键.StringBuilder和额外的格式不是必需的,它仅用于说明用法.

import java.lang.reflect.Field;
...

StringBuilder builder = new StringBuilder();
builder.append("android : ").append(Build.VERSION.RELEASE);

Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
    String fieldName = field.getName();
    int fieldValue = -1;

    try {
        fieldValue = field.getInt(new Object());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    if (fieldValue == Build.VERSION.SDK_INT) {
        builder.append(" : ").append(fieldName).append(" : ");
        builder.append("sdk=").append(fieldValue);
    }
}

Log.d(LOG_TAG, "OS: " + builder.toString());
Run Code Online (Sandbox Code Playgroud)

在我的4.1模拟器上,我得到了这个输出:

D/MainActivity( 1551): OS: android : 4.1.1 : JELLY_BEAN : sdk=16
Run Code Online (Sandbox Code Playgroud)

请享用!

  • 对于可以针对每个版本定期更新的应用程序,静态数组可能是理想的,但对于许多Android版本可能无法更新的项目,这可能仍然是首选解决方案. (4认同)
  • 使用自己的静态名称数组并通过索引查找它会更简单,更安全. (3认同)

Shy*_*mar 15

优化的代码,这将工作:

import java.lang.reflect.Field;

Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Log.d("Android OsName:",osName);
Run Code Online (Sandbox Code Playgroud)


小智 13

经过API 28(安卓派)Build.VERSION_CODES改变了某些字段。

因此,如果您使用:

Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Run Code Online (Sandbox Code Playgroud)

由于超出范围异常,将立即导致您的应用程序崩溃。

所有 API 级别的解决方案是:

Field[] fields = Build.VERSION_CODES.class.getFields();
String codeName = "UNKNOWN";
for (Field field : fields) {
    try {
        if (field.getInt(Build.VERSION_CODES.class) == Build.VERSION.SDK_INT) {
            codeName = field.getName();
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者在 Kotlin 中使用 Java 8 的风格:

val fields = Build.VERSION_CODES::class.java.fields
var codeName = "UNKNOWN"
fields.filter { it.getInt(Build.VERSION_CODES::class) == Build.VERSION.SDK_INT }
      .forEach { codeName = it.name }
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用firstOrNull,而不是在过滤列表上循环。`val fields = Build.VERSION_CODES::class.java.fields val codeName fields.firstOrNull { it.getInt(Build.VERSION_CODES::class) == Build.VERSION.SDK_INT }?.name ?: "UNKNOWN"` (6认同)

Phi*_*ami 5

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html包含具有您正在寻找的名称的字段.因此,您可以使用反射来查找哪个字段对应于"版本"值.

你为什么要这个名字?