【问题标题】:Retrieving Android API version programmatically以编程方式检索 Android API 版本
【发布时间】:2011-03-26 07:45:53
【问题描述】:

有没有办法获取手机当前运行的API版本?

【问题讨论】:

    标签: android android-api-levels


    【解决方案1】:

    如 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 的精确性)。

    对应的android文档是herehere

    【讨论】:

    • 如果代码在 1.5 上运行,那么引用 SDK_INT 将引发异常,因为它是使用 API 4 引入的。(是的,您可以在 1.5 上运行使用 API 4 代码编译的 APK。是的,当达到 API 4 代码时,它会抛出异常。)
    • @ProgrammerBruce 如何防止崩溃?或者如何复古兼容?
    • @Cœur 我认为现在构建一个与 Android 1.5 兼容的复古应用程序并不是很有用。只需将您的项目 minSdkVersion 设置为 4 (Android 1.6) 并继续。
    • 为什么不使用字符串 android.os.Build.VERSION.SDK 代替?它适用于所有 Android 版本
    • @PYK 此属性 android.os.Build.VERSION.SDK 已弃用,因此不应使用。 developer.android.com/reference/android/os/…
    【解决方案2】:

    非常简单:

       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 是我想要的。谢谢@CommonSenseCode
    • 只记得 SDK_INT 是在 API 级别 4 中添加的
    【解决方案3】:
    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_INTpublic static final int SDK_INTAdded in API level 4 如何 int(不是整数)返回 NULLNULL 是对象的状态,因此理论上它的 Build 或 VERSION 可能是 null,但在这种情况下,不仅 SDK_INT,而且 RELEASE 也会导致 NPE。 SDK_INT 可能会导致“没有这样的方法异常”或类似的东西,但不是 null 或 NPE。如果只有自定义 ROM 会破坏文档和声明为 public static final Integer SDK_INT 的方法。我只是想确定问题的性质以解决问题。
    • 谁能验证这是否是事实? Stan 的评论清楚地表明 null 是不可能的。并且定制的 Android ROM / OS 肯定必须来自某个版本的构建?那么 Build.VERSION.SDK_INT 肯定应该反映这一点吗?
    • 我对此投了反对票,因为该声明并没有得到真正的支持,而且关于 null 的警告没有意义。
    • root 手机或自定义 rom 永远不要碰这个号码。不过,他们通常会更改 Build.VERSION.RELEASE。
    • 自定义 OS/Rom 存在很多已知问题。我当时在旧版 Android 上的版本(我想说 GS3)有这个问题。硬编码值或值不正确存在很多问题。硬示例,Wi-Fi Mac 地址被硬编码。
    【解决方案4】:

    试试这个:

     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
         // only for gingerbread and newer versions
     }
    

    【讨论】:

      【解决方案5】:

      综合考虑,这里是我用来检测设备是否有 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;
          }
      }
      

      如果代码不适合你,请告诉我。

      【讨论】:

        【解决方案6】:

        android.os.Build.VERSION.SDK 应该为您提供 API 级别的值。您可以在 android 文档中轻松找到从 api 级别到 android 版本的映射。我相信,8 代表 2.2,7 代表 2.1,依此类推。

        【讨论】:

        • 此方法已弃用。
        【解决方案7】:

        SDK.INT 支持 Android 1.6 及更高版本

        所有版本

        都支持SDK

        所以我这样做:

        String sdk_version_number = android.os.Build.VERSION.SDK;
        

        感谢CommonsWareanswer

        【讨论】:

        • SDK 在 Java 中已弃用。
        • @limonik 没错,SDK 从 API 级别 1 开始就存在,但在 API 级别 15 中已被弃用
        【解决方案8】:

        知道了。它使用Context 类的getApplicationInfo() 方法。

        【讨论】:

        • 这将为您提供 APK 的 minSdkVersion 和 targetSdkVersion,其中描述了应用程序支持的 API 版本。这不是应用当前运行的手机的 API 版本。
        【解决方案9】:

        我一般更喜欢在函数中添加这些代码来获取Android版本:

        int whichAndroidVersion;
        
        whichAndroidVersion= Build.VERSION.SDK_INT;
        textView.setText("" + whichAndroidVersion); //If you don't use "" then app crashes.
        

        例如,上面的代码现在会将我的 textView 中的文本设置为“29”。

        【讨论】:

          【解决方案10】:

          我更喜欢将版本作为数字处理,比我写的更容易:

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

          【讨论】:

            【解决方案11】:

            我改进了我使用的代码

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

            【讨论】:

              【解决方案12】:

              像这样:

              String versionRelease = BuildConfig.VERSION_NAME;
              
              versionRelease :- 2.1.17
              

              请确保您的导入包正确(import package your_application_package_name,否则将无法正常工作)。

              【讨论】:

                猜你喜欢
                • 2014-11-20
                • 2022-11-16
                • 2023-03-31
                • 1970-01-01
                • 2017-06-23
                • 1970-01-01
                • 1970-01-01
                • 2015-09-10
                • 2013-06-28
                相关资源
                最近更新 更多