Detectar código de versión de Android N

¿Es posible detectar si un usuario está ejecutando Android N?

Tengo un Nexus 6 con Android Developer Preview N. Si intento obtener la versión de compilación con Build.VERSION.SDK_INT , devuelve 23 que es igual a Android Marshmallow.

Citando a mí mismo :

Siguiendo el enfoque que Google utilizó para la M Developer Preview, puede comprobar Build.VERSION.CODENAME en Build.VERSION.CODENAME lugar:

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

No he mirado Build.VERSION.RELEASE , como sugiere el comentario de zgc7009, aunque eso también puede ser una posibilidad.

Además, si está leyendo esto desde un futuro lejano, donde Android N ha enviado en forma final, debería ser capaz de utilizar Build.VERSION.SDK_INT y Build.VERSION_CODES.N . El hack anterior se debe a la idiosincrasia de cómo Google maneja estas vistas previas de desarrolladores.

Enfoque 1: (recomendado) Utilice la biblioteca de soporte android.support.v4.os.BuildCompat.isAtLeastN .

Enfoque 2: Utilice esto como el código de versión "real": 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 .

Yo recomendaría usar el valor Integer para comprobar la versión de Android en lugar de String

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

Sólo recuerda que es necesario tener compileSdkVersion a 24 o superior en manifests.xml:

 compileSdkVersion 24 

He descubierto que el comportamiento de Build.VERSION.RELEASE y Build.VERSION.CODENAME es muy diferente dependiendo de si se trata de una versión de producción completa de Android OS o una vista previa de desarrollador. Fuimos con el siguiente mecanismo. No puede confiar en un solo valor si desea tener en cuenta más de un escenario.

Esto es lo que encontré fue el caso de un Galaxy S7 que ejecuta un lanzamiento de producción de Nougat y un Nexus 5X corriendo 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"); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.