Определить код версии Android N

Можно ли определить, использует ли пользователь Android N?

У меня Nexus 6 с Android N Developer Preview. Если я попытаюсь получить версию сборки с помощью Build.VERSION.SDK_INT, он вернет 23, что равно Android Marshmallow.


person Tom Sabel    schedule 01.04.2016    source источник
comment
Вам нужна версия выпуска, а не версия SDK. Build.VERSION.RELEASE. Он вернет строковое представление версии, работающей на устройстве; Я уверен на 99%. Давненько этого не делал.   -  person zgc7009    schedule 01.04.2016
comment
Спасибо, Build.VERSION.RELEASE возвращает N   -  person Tom Sabel    schedule 01.04.2016


Ответы (4)


Цитирую от себя:

Следуя подходу, который 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. Вышеупомянутый взлом связан с особенностями того, как Google обрабатывает эти предварительные просмотры для разработчиков.

person CommonsWare    schedule 01.04.2016
comment
Кажется, CODENAME всегда REL для выпуска версии ОС. Мы закончили с решением, которое я разместил здесь. - person the_new_mr; 18.05.2017
comment
idiosyncrasies откуда вы взяли эти слова? - person eC Droid; 21.07.2017

Я бы рекомендовал использовать значение Integer для проверки версии Android, а не String

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

Просто помните, что необходимо иметь compileSdkVersion до 24 или выше в manifest.xml:

compileSdkVersion 24
person Maher Abuthraa    schedule 07.11.2016
comment
Обратите внимание, что для предварительного просмотра O public static final int O = 10000; Однако Build.VERSION.SDK_INT = 25. - person Mygod; 15.05.2017

Подход 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.

person Mygod    schedule 15.05.2017

Я обнаружил, что поведение Build.VERSION.RELEASE и Build.VERSION.CODENAME сильно различается в зависимости от того, является ли это полной рабочей версией ОС Android или предварительной версией для разработчиков. Мы пошли по следующему механизму. Вы не можете полагаться только на одно значение, если хотите учитывать более одного сценария.

Это то, что я обнаружил, в случае с Galaxy S7, работающим с производственной версией Nougat, и Nexus 5X, работающим с O DP1.

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");
        }
    }
person the_new_mr    schedule 18.05.2017