2012-05-11 11 views

risposta

47

Come suggerito in precedenza, la riflessione sembra essere la chiave di questa domanda. StringBuilder e formattazione extra non sono necessari, è stato aggiunto solo per illustrare l'utilizzo.

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()); 

Sul mio 4.1 emulatore, ottengo questo output:

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

Enjoy!

+3

Sarebbe più semplice e più sicuro usare la tua matrice statica dei nomi e cercarla per indice. – CommonsWare

+4

Un array statico potrebbe essere l'ideale per un'app che potrebbe essere aggiornata regolarmente per ogni versione, ma per i progetti che potrebbero non essere aggiornati per molte versioni di Android, questa potrebbe essere ancora una soluzione preferita. –

5

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html contiene campi con il nome che stai cercando. Quindi è possibile utilizzare la riflessione per trovare il campo corrispondente al valore "versione".

Perché vuoi il nome?

+0

il requisito del cliente è quello di ottenere il numero di versione e il nome della versione del suo telefono – Venkat

+0

Quindi è meglio inviare il Build.VERSION.SDK_INT al server e quindi fare una mappatura da quella int ai nomi che si vogliono dare ai propri client. –

+0

SO non esiste un modo diretto per ottenere il nome della versione ???? – Venkat

3

Check this out:

// 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) 

Essere consapevoli del fatto che questa soluzione funziona solo per quanto riguarda i codici di versione continuano ad essere incrementato di uno, e si dovrà aggiornare l'elenco con ogni nuova versione di Android (se essere precisi è importante).

+5

Quindi, ogni singola versione di Android dovrai aggiornare questo array, debole. –

1

Come descritto nella documentazione android, il livello SDK (numero intero) il telefono è in esecuzione è disponibile in:

android.os.Build.VERSION.SDK_INT;

L'enum corrispondente a questo int è nella classe android.os.Build.VERSION_CODES.

Codice esempio:

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: Questo SDK_INT è disponibile dal Donut (Android 1.6/API4) in modo da assicurarsi che l'applicazione non è retro-compatibile con Cupcake (Android 1.5/API3) quando lo si utilizza o la tua applicazione si bloccherà (grazie al programmatore Bruce per la precisione).

9

codice ottimizzato, questo funzionerà:

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();

Questo codice funzionerà. Quindi, usa la variabile osName come vuoi.

-1

È possibile provare la seguente funzione.

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

Si prega di notare che se si desidera promuovere il proprio sito Web o blog, ** è necessario rendere nota la propria affiliazione nella risposta **. In caso contrario, la tua risposta potrebbe essere contrassegnata come spam. Si prega di leggere [Come non essere uno spammer] (https://stackoverflow.com/help/promotion). – iBug

0

riflessione non funziona quando ho provato in emulatore in esecuzione su API 19.

Così ho venire con una risposta ibrido di "Nacho Coloma" e "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"; 
} 
Problemi correlati