【问题标题】:How to get a human readable Android OS version如何获得人类可读的 Android 操作系统版本
【发布时间】:2015-04-28 09:50:45
【问题描述】:

使用以下方法获取当前设备 API 级别相当简单直接:

Build.VERSION.SDK_INT

并且使用它也很容易获得Build.VERSION_CODES的版本名称

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

现在,我可以自己手动添加操作系统版本字符串列表 - 这很好,但是一旦我们通过 API 22,我将不得不更新产品以添加一些额外的字符串。

我的大脑告诉我必须有一个内部字段在操作系统中某处显示此值,但我发现很难找到它在哪里。

任何帮助都会很有用

【问题讨论】:

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

标签: android internationalization


【解决方案1】:

这是一个 hack,所以我真的不想使用它。然而,它确实设法使用正则表达式来提取一些非常合理的显示值。

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 };
}

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多