Czy jest jakiś sposób, aby uzyskać wersję interfejsu API, na której telefon aktualnie działa?
Czy jest jakiś sposób, aby uzyskać wersję interfejsu API, na której telefon aktualnie działa?
Odpowiedzi:
Zgodnie z opisem w dokumentacji systemu Android poziom SDK (liczba całkowita), w którym działa telefon, jest dostępny w:
android.os.Build.VERSION.SDK_INT
Klasa odpowiadająca temu int jest w android.os.Build.VERSION_CODES
klasie.
Przykład kodu:
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
}
Edycja : Ten SDK_INT jest dostępny od wersji Donut (Android 1.6 / API4), więc upewnij się, że twoja aplikacja nie jest kompatybilna z Cupcake (Android 1.5 / API3), gdy go używasz, bo inaczej aplikacja się zawiesi (dzięki Programmer Bruce za precyzję) .
Odpowiednia dokumentacja Androida znajduje się tutaj i tutaj
minSdkVersion
na 4
(Android 1.6) i kontynuuj.
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;
To da ci rzeczywiste numery twojej wersji; alias 2.3.3 lub 2.2. Problem z używaniem Build.VERSION.SDK_INT polega na tym, że jeśli masz zrootowany telefon lub niestandardowy ROM, możesz mieć niestandardowy system operacyjny (inaczej mój Android działa 2.3.5), który zwróci wartość null podczas korzystania z Build.VERSION.SDK_INT więc Build.VERSION.RELEASE będzie działać bez względu na standardową wersję Androida lub nie!
Aby go użyć, możesz po prostu to zrobić;
String androidOS = Build.VERSION.RELEASE;
int android.os.Build.VERSION.SDK_INT
i public static final int SDK_INT
i Added in API level 4
jak można int (nie Integer) powrót NULL
? NULL
jest stanem obiektu, więc jego Kompilacja lub WERSJA mogłaby być null
teoretycznie, ale w takim przypadku nie tylko, SDK_INT
ale RELEASE
również spowoduje NPE. SDK_INT prawdopodobnie może powodować „Brak takiego wyjątku metody” lub coś w tym rodzaju, ale nie zerowy lub NPE. Jeśli tylko niestandardowa pamięć ROM zepsuje dokumenty, a metoda zadeklarowana jako public static final Integer SDK_INT
. Próbuję tylko ustalić naturę problemu, aby dokonać obejścia.
null
nie ma sensu.
Biorąc pod uwagę wszystkie powiedziane, oto kod, którego używam do wykrywania, czy urządzenie ma Froyo lub nowszy system operacyjny Android (2.2+):
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;
}
Oczywiście możesz to zmienić, jeśli uwzględnisz wersje Androida 1.0 i 1.5, jeśli potrzebujesz ogólnego kontrolera. Prawdopodobnie skończysz z czymś takim:
// 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;
}
}
Daj mi znać, jeśli kod nie działa dla Ciebie.
Spróbuj tego:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
Rozumiem. Wykorzystuje getApplicationInfo()
metodę Context
klasy.
SDK.INT jest obsługiwany dla Androida 1.6 i nowszych
SDK jest obsługiwany dla wszystkich wersji
Ja również:
String sdk_version_number = android.os.Build.VERSION.SDK;
Kredyty dla: Commons Zastanów się nad tą odpowiedzią
wolę mieć wersję jako numer, aby łatwiej ją sprzedawać, niż napisałem:
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();
}
Jego działanie Happy Coding
String versionRelease = BuildConfig.VERSION_NAME;
versionRelease :- 2.1.17
Uwaga Upewnij się, że pakiet importu jest poprawny (pakiet importu nazwa pakietu aplikacji, w przeciwnym razie nie będzie działał poprawnie)
Poprawiłem używany kod
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;
}