【问题标题】:Detect Android N version code检测Android N版本代码
【发布时间】:2016-04-01 12:49:48
【问题描述】:

是否可以检测用户是否在运行 Android N?

我有一个装有 Android N 开发者预览版的 Nexus 6。如果我尝试使用Build.VERSION.SDK_INT 获取构建版本,它会返回 23,它等于 Android Marshmallow。

【问题讨论】:

  • 你需要的是release版本,而不是sdk版本。 Build.VERSION.RELEASE。它将返回设备上运行的版本的字符串表示;我有 99% 的把握。好久没做这个了。
  • 谢谢,Build.VERSION.RELEASE 正在返回“N”

标签: android android-7.0-nougat


【解决方案1】:

引用myself:

按照 Google 用于 M Developer Preview 的方法, 您可以改为查看Build.VERSION.CODENAME:

public static boolean iCanHazN() {
  return("N".equals(Build.VERSION.CODENAME));
}

我没有看过 Build.VERSION.RELEASE,正如 zgc7009 的评论所建议的那样,尽管这也可能是一种可能性。

此外,如果您是从遥远的将来阅读本文,Android N 已经以最终形式发布,您应该能够使用Build.VERSION.SDK_INT 和Build.VERSION_CODES.N。上述 hack 是由于 Google 处理这些开发者预览的方式的特殊性。

【讨论】:

  • 对于发布的操作系统版本,CODENAME 似乎总是“REL”。我们结束了我在此处发布的解决方案。
  • idiosyncrasies你从哪里得到这些词?
【解决方案2】:

我建议使用整数值而不是字符串来检查 Android 版本

public boolean isAndroidN() {
        return Build.VERSION.SDK_INT == Build.VERSION_CODES.N;
    }

请记住,必须在 manifests.xml 中将 compileSdkVersion 设置为 24 或更高:

compileSdkVersion 24

【讨论】:

  • 请注意,对于 O 预览版,public static final int O = 10000; 但是Build.VERSION.SDK_INT = 25。
【解决方案3】:

方法一:(推荐)使用支持库android.support.v4.os.BuildCompat.isAtLeastN。

方法 2:将其用作“真实”版本代码:Build.VERSION.SDK_INT < 23 || Build.VERSION.PREVIEW_SDK_INT == 0 ? Build.VERSION.SDK_INT : Build.VERSION.SDK_INT + 1。

【讨论】:

    【解决方案4】:

    我发现 Build.VERSION.RELEASE 和 Build.VERSION.CODENAME 的行为完全不同,这取决于它是 Android 操作系统的完整生产版本还是开发者预览版。我们采用了以下机制。如果要考虑多个场景,则不能只依赖一个值。

    这是我发现运行 Nougat 生产版本的 Galaxy S7 和运行 O DP1 的 Nexus 5X 的情况。

    银河 S7 牛轧糖 Build.VERSION.BASE_OS: Build.VERSION.CODENAME:REL Build.VERSION.INCREMENTAL:G930FXXU1DQB3 Build.VERSION.PREVIEW_SDK_INT:0 Build.VERSION.RELEASE:7.0 Build.VERSION.SDK_INT:24 Build.VERSION.SECURITY_PATCH:2017-01-01

    Nexus 5X O Build.VERSION.BASE_OS: Build.VERSION.CODENAME:O Build.VERSION.INCREMENTAL:3793265 Build.VERSION.PREVIEW_SDK_INT:1 Build.VERSION.RELEASE:O Build.VERSION.SDK_INT:25 Build.VERSION.SECURITY_PATCH:2017-03-05

    // release builds of Android (i.e. not developer previews) have a CODENAME value of "REL"
        // check this. if it's REL then you can rely on value of SDK_INT (SDK_INT is inaccurate for DPs
        // since it has the same value as the previous version of Android)
        // if it's not REL, check its value. it will have a letter denoting the Android version (N for Nougat, O for... er... O and so on)
    
        boolean laterThanNougat = false;
    
        if(Build.VERSION.CODENAME.equals("REL")) {
            Log.i(TAG, "This is a release build");
    
            // since this is a release build, we can rely on value of SDK_INT
            if (android.os.Build.VERSION.SDK_INT > 25) {
                Log.i(TAG, "This is later than Nougat");
                laterThanNougat = true;
            } else {
                Log.i(TAG, "This is Nougat or before");
            }
        } else {
            Log.i(TAG, "This is NOT a release build");
    
            // since this is not a release build, we can't rely on value of SDK_INT. must check codename again
            if(Build.VERSION.CODENAME.compareTo("N") > 0) {
                Log.i(TAG, "This is later than Nougat");
                laterThanNougat = true;
            } else {
                Log.i(TAG, "This is Nougat or before");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2019-10-17
      • 2011-08-21
      • 2023-03-15
      • 2014-04-12
      • 1970-01-01
      相关资源
      最近更新 更多