Intereting Posts
Предварительный просмотр пользовательских шрифтов в Android Studio ContentObserver onChange GetDimension () / getDimensionPixelSize () – проблема mutliplier Лучшие 5 баллов из таблицы google Неопределенная ссылка на `__android_log_print ' Какая польза от layoutinflator? Как для всех, как правильно сохранить состояние экземпляров фрагментов в стеке? Android не прерывает поток ASyncTask после onPostExecution Как проверить, отключен ли телефон, вибрировать или громко в андроиде Импортировать CSV-контакты в телефон Android 4 Ошибочно используется смешанное имя пакета в уже развернутом приложении, могу ли я изменить его на нижний регистр? Android подключается к службе обслуживания WCF в IIS с самозаверяющей аутентификацией сертификата клиента Фрагменты и действия – где я могу поместить свою логику приложения? NetworkOnMainThreadException в IntentService Андроид-клиент анализирует данные множественной формы для non ascii

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

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

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

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

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

Подход 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 Build.VERSION.SDK_INT < 23 || Build.VERSION.PREVIEW_SDK_INT == 0 ? Build.VERSION.SDK_INT : Build.VERSION.SDK_INT + 1 Build.VERSION.SDK_INT < 23 || Build.VERSION.PREVIEW_SDK_INT == 0 ? Build.VERSION.SDK_INT : Build.VERSION.SDK_INT + 1 .

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

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

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

 compileSdkVersion 24 

Я обнаружил, что поведение 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 (ie 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"); } }