如何获得人类可读的Android操作系统版本

如何获得人类可读的Android操作系统版本,android,internationalization,Android,Internationalization,使用以下工具获取当前设备API级别非常简单和直接: Build.VERSION.SDK_INT 使用它也很容易获得Build.version\u code public static String getDisplayOS() { Field[] fields = Build.VERSION_CODES.class.getFields(); for (Field field : fields) { String fieldName = field.getName

使用以下工具获取当前设备API级别非常简单和直接:

Build.VERSION.SDK_INT
使用它也很容易获得
Build.version\u code

public static String getDisplayOS() {
    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) {
            return fieldName;
        }
    }
    return "";
}
问题在于,这会给出如下值:

JELLY_BEAN_MR1
HONEYCOMB_MR2
现在,我可以自己手动添加一个OS版本字符串列表——这很好,但一旦我们通过API 22,我就必须更新产品,只需添加一些额外的字符串

我的大脑告诉我,肯定有一个内部字段在操作系统的某个地方显示这个值,但我发现很难找到它在哪里


任何帮助都是有用的

这是一个黑客程序,所以我真的不想使用它。不过,它确实设法使用regexing来提取一些相当合理的显示值

public static String[] getDisplayOS() {
    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) {          
            fieldName = fieldName.replaceAll("_", " ");
            String firstLetter = fieldName.substring(0, 1);
            fieldName = firstLetter.toUpperCase() + fieldName.substring(1).toLowerCase();

             Pattern p = Pattern.compile(" [a-z]");
             Matcher m = p.matcher(fieldName);
             while (m.find()) {
                 int index = m.start();
                 fieldName = fieldName.substring(0, index) + fieldName.substring(index, index+2).toUpperCase() + fieldName.substring(index+2);
             }

             Pattern mrPattern = Pattern.compile(" (Mr\\d)");
             Matcher mrMatcher = mrPattern.matcher(fieldName);
             if (mrMatcher.find()) {
                 fieldName = fieldName.replaceAll(" Mr\\d", "");                 
                 return new String[] { fieldName, mrMatcher.group(1).toUpperCase() };
             }
             return new String[] { fieldName, null };
        }
    }
    return new String[] { null, null };
}

... 使用开关盒?比如:
switch(Build.VERSION.SDK_INT){case 1:return“First Android VERSION!”;break;}
在什么数据集上?我正在寻找一个数据集,其中包括人类可读的值,这些值应该在设备上的某个地方可用。我认为在任何地方都没有这样的表(除了返回“JELLY\u BEAN\u MR1”的表)。因此,您会得到
MR1
等等。顺便说一句,您可以简单地用
替换
,用
“维护版本”
替换
“MR”
。因此,您将获得
“果冻豆维护发行版1”
。更好的是,如果您将字符串的大小写正确(每个单词的第一个字符都是大写的,其余的都是小写的),那么最终将得到
“Jelly Bean Maintenance Release 1”
。我想不出比这更简单更好的了。是的,这一直是我的退路(我现在将作为答案发布),但我不想求助于依靠谷歌保持命名约定的字符串操作(当然,这在现阶段很有可能)