2012-05-11 25 views

Odpowiedz

47

Jak sugerowano wcześniej, refleksja wydaje się być kluczem do tego pytania. StringBuilder i dodatkowe formatowanie nie są wymagane, zostały dodane tylko w celu zilustrowania użycia.

import java.lang.reflect.Field; 
... 

StringBuilder builder = new StringBuilder(); 
builder.append("android : ").append(Build.VERSION.RELEASE); 

Field[] fields = Build.VERSION_CODES.class.getFields(); 
for (Field field : fields) { 
    String fieldName = field.getName(); 
    int fieldValue = -1; 

    try { 
     fieldValue = field.getInt(new Object()); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 

    if (fieldValue == Build.VERSION.SDK_INT) { 
     builder.append(" : ").append(fieldName).append(" : "); 
     builder.append("sdk=").append(fieldValue); 
    } 
} 

Log.d(LOG_TAG, "OS: " + builder.toString()); 

Na moim 4.1 emulatora, otrzymuję ten wynik:

D/MainActivity(1551): OS: android : 4.1.1 : JELLY_BEAN : sdk=16 

Enjoy!

+3

Byłoby prostsze i bezpieczniejsze, aby użyć własnej statycznej tablicy nazw i sprawdzić ją według indeksu. – CommonsWare

+4

Tablica statyczna może być idealna dla aplikacji, która może być regularnie aktualizowana dla każdej wersji, ale dla projektów, które mogą nie być aktualizowane dla wielu wersji Androida, może to nadal być preferowane rozwiązanie. –

5

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html zawiera pola, które mają nazwę, której szukasz. Możesz więc użyć reflexion, aby znaleźć pole odpowiadające wartości "version".

Dlaczego chcesz nazwę?

+0

wymaganiem klienta jest uzyskanie numeru wersji i wersji jego telefonu komórkowego. – Venkat

+0

Najprawdopodobniej najlepiej jest wysłać plik Build.VERSION.SDK_INT na serwer, a następnie mapować dane z tego int na nazwy, które chcesz przekazać swoim klientom. –

+0

SO nie ma bezpośredniego sposobu na uzyskanie nazwy wersji ???? – Venkat

3

to sprawdzić:

// Names taken from android.os.build.VERSION_CODES 
String[] mapper = new String[] { 
    "ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT", 
    "ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", "GINGERBREAD", 
    "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2", 
    "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN" 
}; 
int index = Build.VERSION.SDK_INT - 1; 
String versionName = index < mapper.length? mapper[index] : "UNKNOWN_VERSION"; // > JELLY_BEAN) 

Należy pamiętać, że to rozwiązanie będzie działać tylko jeśli chodzi o kody wersja wciąż jest zwiększany o jeden, i trzeba będzie zaktualizować listę z każdej nowej wersji Androida (jeśli dokładność jest ważna).

+5

Więc co, każda nowa wersja Androida będziesz musiał zaktualizować tę tablicę, słabe. –

1

Jak opisano androidki dokumentacji poziom SDK (liczba całkowita), gdy telefon jest uruchomiony jest dostępne w:

android.os.Build.VERSION.SDK_INT;

Wyliczenie odpowiadające tej int znajduje się w klasie android.os.Build.VERSION_CODES. Przykładem

Kod:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO){ 
    // Do something for froyo and above versions 
} else{ 
    // do something for phones running an SDK before froyo 
} 

Edit: Ten SDK_INT jest dostępny od Donut (Android 1.6/API4), więc upewnij się, że aplikacja nie jest retro-kompatybilny z Cupcake (Android 1.5/API3), kiedy go użyć lub Twoja aplikacja ulegnie awarii (dzięki programistce Bruce za precyzję).

9

kod zoptymalizowany, to będzie działać:

import java.lang.reflect.Field; 

Field[] fields = Build.VERSION_CODES.class.getFields(); 
String osName = fields[Build.VERSION.SDK_INT + 1].getName(); 
Log.d("Android OsName:",osName); 
0

import java.lang.reflect.Field; Field[] fields = Build.VERSION_CODES.class.getFields(); String osName = fields[Build.VERSION.SDK_INT + 1].getName();

Ten kod będzie działać. Następnie wystarczy użyć zmiennej osName, jak tylko chcesz.

-1

Możesz spróbować następujących funkcji.

public String AndroidOSName() { 
    String os = Build.VERSION.SDK; 
    System.out.println("here is my os" + " " + os); 
    if (os.equals("23")) { 
     return "Marshmallow"; 
    } else if (os.equals("21")) { 
     return "Lollipop"; 
    } else if (os.equals("22")) { 
     return "LOLLIPOP_MR1"; 
    } else if (os.equals("20")) { 
     return "KitKat"; 
    } else if (os.equals("19")) { 
     return "KitKat"; 
    } else if (os.equals("18")) { 
     return "Jelly Bean"; 
    } else if (os.equals("17")) { 

     return "Jelly Bean"; 
    } else if (os.equals("16")) { 
     return "Jelly Bean"; 
    } else if (os.equals("15")) { 
     return "Ice Cream Sandwich"; 
    } else if (os.equals("14")) { 
     return "Ice Cream Sandwich"; 
    } else if (os.equals("13")) { 
     return "Honeycomb"; 
    } else if (os.equals("12")) { 
     return "Honeycomb"; 
    } else if (os.equals("11")) { 
     return "Honeycomb"; 
    } else if (os.equals("10")) { 
     return "Gingerbread"; 
    } else if (os.equals("9")) { 
     return "Froyo"; 
    } else if (os.equals("8")) { 
     return "Froyo"; 
    } else { 
     return "Not Found"; 
    } 

} 
+3

Uwaga: jeśli chcesz promować własną stronę internetową lub blog, ** musisz ujawnić swoją przynależność w odpowiedzi **. W przeciwnym razie Twoja odpowiedź może zostać oznaczona jako spam. Przeczytaj [Jak nie być spamerem] (https://stackoverflow.com/help/promotion). – iBug

0

Odbicie nie działa, gdy próbowałem w emulatorze działa na API 19.

więc wymyślić z hybrydowym odpowiedź z "Nacho Coloma" i "Kevin Grant"

String osName=""; 
Field[] fields = Build.VERSION_CODES.class.getFields(); 
for (Field field : fields) { 
    String fieldName = field.getName(); 
    int fieldValue = -1; 

    try { 
     fieldValue = field.getInt(new Object()); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 

    if (fieldValue == Build.VERSION.SDK_INT) { 
     osName=fieldName; break; 
    } 
} 
if(osName.isEmpty()) { 
    String[] mapper = new String[]{ 
      "ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT", 
      "ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", 
      "GINGERBREAD", "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", 
      "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN", 
      "JELLY_BEAN", "JELLY_BEAN", "KITKAT", "KITKAT", 
      "LOLLIPOOP", "LOLLIPOOP_MR1", "MARSHMALLOW", "NOUGAT", 
      "NOUGAT", "OREO", "OREO", "ANDROID P"}; 
    int index = Build.VERSION.SDK_INT - 1; 
    osName = index < mapper.length ? mapper[index] : "UNKNOWN_VERSION"; 
}