Gibt es eine Möglichkeit, die API-Version abzurufen, auf der das Telefon gerade ausgeführt wird?
Gibt es eine Möglichkeit, die API-Version abzurufen, auf der das Telefon gerade ausgeführt wird?
Antworten:
Wie in der Android-Dokumentation beschrieben, ist die SDK-Ebene (Ganzzahl), auf der das Telefon ausgeführt wird, verfügbar in:
android.os.Build.VERSION.SDK_INT
Die diesem int entsprechende Klasse befindet sich in der android.os.Build.VERSION_CODES
Klasse.
Codebeispiel:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
// Do something for lollipop and above versions
} else{
// do something for phones running an SDK before lollipop
}
Bearbeiten : Dieses SDK_INT ist seit Donut (android 1.6 / API4) verfügbar. Stellen Sie daher sicher, dass Ihre Anwendung nicht mit Cupcake (android 1.5 / API3) retro-kompatibel ist, wenn Sie es verwenden, da Ihre Anwendung sonst abstürzt (danke an Programmer Bruce für die Präzision). .
Die entsprechende Android-Dokumentation finden Sie hier und hier
minSdkVersion
auf 4
(Android 1.6) und fahren Sie fort.
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
int version = Build.VERSION.SDK_INT;
String versionRelease = Build.VERSION.RELEASE;
Log.e("MyActivity", "manufacturer " + manufacturer
+ " \n model " + model
+ " \n version " + version
+ " \n versionRelease " + versionRelease
);
E/MyActivity: manufacturer ManufacturerX
model SM-T310
version 19
versionRelease 4.4.2
Build.VERSION.RELEASE;
Das gibt Ihnen die tatsächlichen Nummern Ihrer Version; aka 2.3.3 oder 2.2. Das Problem bei der Verwendung von Build.VERSION.SDK_INT besteht darin, dass Sie bei einem gerooteten Telefon oder einem benutzerdefinierten ROM möglicherweise ein nicht standardmäßiges Betriebssystem haben (auch bekannt als mein Android läuft 2.3.5), das bei Verwendung von Build.VERSION.SDK_INT eine Null zurückgibt Build.VERSION.RELEASE funktioniert also unabhängig von der Standard-Android-Version oder nicht!
Um es zu benutzen, könnten Sie dies einfach tun;
String androidOS = Build.VERSION.RELEASE;
int android.os.Build.VERSION.SDK_INT
und public static final int SDK_INT
und Added in API level 4
wie könnte int (nicht Integer) zurückkehren NULL
? NULL
ist ein Zustand für ein Objekt, so dass sein Build oder seine VERSION null
theoretisch sein könnte, aber in diesem Fall nicht nur, SDK_INT
sondern RELEASE
auch eine NPE verursachen wird. SDK_INT könnte wahrscheinlich "Keine solche Methodenausnahme" oder ähnliches verursachen, aber nicht null oder NPE. Wenn nur ein benutzerdefiniertes ROM die Dokumente und die als deklarierte Methode beschädigt public static final Integer SDK_INT
. Ich versuche nur, die Art eines Problems zu bestimmen, um eine Problemumgehung zu finden.
null
keinen Sinn ergibt.
Unter Berücksichtigung aller genannten Punkte ist hier der Code, mit dem ich erkenne, ob das Gerät über Froyo oder ein neueres Android-Betriebssystem (2.2+) verfügt:
public static boolean froyoOrNewer() {
// SDK_INT is introduced in 1.6 (API Level 4) so code referencing that would fail
// Also we can't use SDK_INT since some modified ROMs play around with this value, RELEASE is most versatile variable
if (android.os.Build.VERSION.RELEASE.startsWith("1.") ||
android.os.Build.VERSION.RELEASE.startsWith("2.0") ||
android.os.Build.VERSION.RELEASE.startsWith("2.1"))
return false;
return true;
}
Natürlich können Sie diese Bedingung ändern, um die Versionen 1.0 und 1.5 von Android zu berücksichtigen, falls Sie einen generischen Prüfer benötigen. Sie werden wahrscheinlich so etwas haben:
// returns true if current Android OS on device is >= verCode
public static boolean androidMinimum(int verCode) {
if (android.os.Build.VERSION.RELEASE.startsWith("1.0"))
return verCode == 1;
else if (android.os.Build.VERSION.RELEASE.startsWith("1.1")) {
return verCode <= 2;
} else if (android.os.Build.VERSION.RELEASE.startsWith("1.5")) {
return verCode <= 3;
} else {
return android.os.Build.VERSION.SDK_INT >= verCode;
}
}
Lassen Sie mich wissen, wenn der Code für Sie nicht funktioniert.
Versuche dies:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
Ich habs. Es verwendet die getApplicationInfo()
Methode der Context
Klasse.
Ich bevorzuge es, die Version als Nummer einfacher zu handhaben, als ich dies geschrieben habe:
public static float getAPIVerison() {
Float f = null;
try {
StringBuilder strBuild = new StringBuilder();
strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
f = new Float(strBuild.toString());
} catch (NumberFormatException e) {
Log.e("", "error retriving api version" + e.getMessage());
}
return f.floatValue();
}
Es funktioniert Happy Coding
String versionRelease = BuildConfig.VERSION_NAME;
versionRelease :- 2.1.17
Hinweis Bitte stellen Sie sicher, dass Ihr Importpaket korrekt ist (importieren Sie das Paket mit dem Namen Ihres Anwendungspakets, sonst funktioniert es nicht richtig).
Ich habe den von mir verwendeten Code verbessert
public static float getAPIVerison() {
float f=1f;
try {
StringBuilder strBuild = new StringBuilder();
strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
f= Float.valueOf(strBuild.toString());
} catch (NumberFormatException e) {
Log.e("myApp", "error retriving api version" + e.getMessage());
}
return f;
}