9

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

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

4

4 回答 4

11

引用我自己的话:

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

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

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

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

于 2016-04-01T12:59:23.300 回答
2

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

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

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

compileSdkVersion 24
于 2016-11-07T15:24:51.470 回答
2

方法1:(推荐)使用支持库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.

于 2017-05-15T09:19:58.890 回答
0

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

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

Galaxy S7 Nougat 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");
        }
    }
于 2017-05-18T14:39:34.817 回答