Is it possible to detect if an user is running Android N?
I have a Nexus 6 with the Android N Developer Preview. If I try to get the build version with Build.VERSION.SDK_INT, it returns 23 which is equal to Android Marshmallow.
Quoting myself:
Following the approach that Google used for the M Developer Preview, you can check
Build.VERSION.CODENAMEinstead:
public static boolean iCanHazN() {
return("N".equals(Build.VERSION.CODENAME));
}
I haven't looked at Build.VERSION.RELEASE, as suggested by zgc7009's comment, though that too may be a possibility.
Also, if you are reading this from the far future, where Android N has shipped in final form, you should be able to use Build.VERSION.SDK_INT and Build.VERSION_CODES.N. The above hack is due to the idiosyncrasies of how Google handles these developer previews.
idiosyncrasies where do you get these words?I would recommend using Integer value for checking Android version rather than String
public boolean isAndroidN() {
return Build.VERSION.SDK_INT == Build.VERSION_CODES.N;
}
Just remember it's necessary to have compileSdkVersion to 24 or higher in manifests.xml:
compileSdkVersion 24
public static final int O = 10000; However Build.VERSION.SDK_INT = 25.I found that the behaviour of Build.VERSION.RELEASE and Build.VERSION.CODENAME is quite different depending on whether it's a full production release of Android OS or a developer preview. We went with the following mechanism. You can't rely on just one value if you want to account for more than one scenario.
This is what I found was the case for a Galaxy S7 running a production release of Nougat and a Nexus 5X running 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. It will return a String representation of the version running on the device; I am 99% sure. Haven't done this in a while.Build.VERSION.RELEASEis returning "N"