2016-04-01 6 views
8

Kann festgestellt werden, ob ein Benutzer Android N ausführt?Android N-Versionscode erkennen

Ich habe ein Nexus 6 mit der Android N Developer Preview. Wenn ich versuche, die Build-Version mit Build.VERSION.SDK_INT zu erhalten, gibt es 23 zurück, was Android Marshmallow entspricht.

+2

Sie benötigen die Release-Version nicht die SDK-Version. 'Build.VERSION.RELEASE'.Es wird eine String-Darstellung der Version zurückgegeben, die auf dem Gerät ausgeführt wird. Ich bin mir zu 99% sicher. Habe das schon lange nicht mehr gemacht. – zgc7009

+0

Danke, 'Build.VERSION.RELEASE' gibt" N "zurück – Exaqt

Antwort

9

Zitiert myself:

den Ansatz verfolgt, dass Google für den M Developer Preview verwendet, können Sie Build.VERSION.CODENAME statt überprüfen:

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

Ich habe nicht auf Build.VERSION.RELEASE sieht, wie vorgeschlagen von zgc7009's Kommentar, obwohl auch das eine Möglichkeit sein könnte.

Auch wenn Sie dies aus der fernen Zukunft lesen, wo Android N in der endgültigen Form ausgeliefert hat, sollten Sie in der Lage sein, Build.VERSION.SDK_INT und Build.VERSION_CODES.N zu verwenden. Der obige Hack beruht auf den Eigenheiten, mit denen Google diese Entwicklervorschauen handhabt.

+1

Es scheint, CODENAME ist immer" REL "für eine Release-OS-Version. Wir haben mit der Lösung, die ich hier gepostet habe, Schluss gemacht. –

+1

'idiosyncrasies' wo bekommst du diese Worte? –

1

Ich würde empfehlen, für die Überprüfung Android-Version Integer-Wert mit eher als String

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

Denken Sie daran, es ist notwendig compileSdkVersion bis 24 oder höher in manifests.xml zu haben:

compileSdkVersion 24 
+1

Beachten Sie, dass für die O-Vorschau 'public static final int 0 = 10000;' Jedoch 'Build.VERSION.SDK_INT = 25'. – Mygod

2

Ansatz 1: (empfohlen) Verwenden Sie die Support-Bibliothek android.support.v4.os.BuildCompat.isAtLeastN.

Ansatz 2: Verwenden Sie diese als "echten" Versionscode: Build.VERSION.SDK_INT < 23 || Build.VERSION.PREVIEW_SDK_INT == 0 ? Build.VERSION.SDK_INT : Build.VERSION.SDK_INT + 1.

0

Ich habe festgestellt, dass das Verhalten von Build.VERSION.RELEASE und Build.VERSION.CODENAME ziemlich unterschiedlich ist, je nachdem, ob es sich um eine vollständige Produktionsversion von Android OS oder eine Entwicklervorschau handelt. Wir gingen mit dem folgenden Mechanismus. Sie können sich nicht auf einen einzigen Wert verlassen, wenn Sie mehr als ein Szenario berücksichtigen möchten.

Dies ist, was ich fand, war der Fall für ein Galaxy S7 läuft eine Produktion Release von Nougat und ein Nexus 5X läuft 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 Bauen .VERSION.SDK_INT: 24 Build.VERSION.SECURITY_PATCH: 2017-01-01

Nexus 5X O Build.VERSION.BASE_OS: Build.VERSION.CODENAME: O Build.VERSION.INCREM Ental: 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"); 
     } 
    }