Можно ли определить, использует ли пользователь Android N?
У меня Nexus 6 с Android N Developer Preview. Если я попытаюсь получить версию сборки с помощью Build.VERSION.SDK_INT
, он вернет 23, что равно Android Marshmallow.
Можно ли определить, использует ли пользователь Android N?
У меня Nexus 6 с Android N Developer Preview. Если я попытаюсь получить версию сборки с помощью Build.VERSION.SDK_INT
, он вернет 23, что равно Android Marshmallow.
Цитирую от себя:
Следуя подходу, который 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 обрабатывает эти предварительные просмотры для разработчиков.
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
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
.
Я обнаружил, что поведение 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");
}
}
Build.VERSION.RELEASE
. Он вернет строковое представление версии, работающей на устройстве; Я уверен на 99%. Давненько этого не делал. - person zgc7009   schedule 01.04.2016Build.VERSION.RELEASE
возвращает N - person Tom Sabel   schedule 01.04.2016