2012-05-11 14 views

答えて

47

前述のように、反射はこの質問の鍵であるようです。 StringBuilderと追加の書式設定は必須ではなく、使い方を説明するためだけに追加されています。私の4.1エミュレータで

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

、私はこの出力を得る:

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

をお楽しみください!

+3

名前の独自の静的配列を使用して索引で検索する方が簡単で安全です。 – CommonsWare

+4

静的配列は、すべてのリリースで定期的に更新できるアプリには理想的ですが、Androidの多くのリリースで更新されないプロジェクトでは、依然として推奨される解決策です。 –

3

あなたは

詳しい情報はこちらのリンクからあったことができ、これらの

android.os.Build.VERSION_CODES 

android.os.Build.VERSION.SDK_INT 
から情報を取得します:

Retrieving Android API version programmatically

・ホープ、この意志を助けます。

5

http://developer.android.com/reference/android/os/Build.VERSION_CODES.htmlには、探している名前のフィールドが含まれています。 したがって、reflexionを使用して、 "version"値に対応するフィールドを見つけることができます。

なぜ名前が必要ですか?

+0

クライアントの要件は、自分のモバイルのバージョン番号とバージョン名を取得することです。 – Venkat

+0

次に、おそらく、サーバーにBuild.VERSION.SDK_INTを送信してから、そのintからクライアントに渡す名前にマッピングすることをお勧めします。 –

+0

だから、バージョン名を取得する直接の方法はありませんか? – Venkat

3

チェックこのアウト:

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

は、このソリューションはまでしかならば(バージョンコードは1つインクリメントされ続けると、あなたはそれぞれの新しいアンドロイドバージョンでリストを更新する必要がありますように動作することに注意してください正確であることが重要です)。電話が動作しているアンドロイドドキュメント、SDKレベル(整数)で説明したように

+5

だから、あなたはこのアレイを更新する必要があります、すべての新しいAndroidのバージョンは、弱い。 –

1

はで利用可能である:

android.os.Build.VERSION.SDK_INT。

このintに対応する列挙型は、android.os.Build.VERSION_CODESクラスにあります。

コード例:

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 
} 

編集:これSDK_INTはドーナッツ(アンドロイド1.6/API4)以降で使用可能ですので、あなたはそれを使用する場合、アプリケーションがカップケーキ(アンドロイド1.5/API3)とレトロ互換性がありませんことを確認してくださいまたはあなたのアプリケーションがクラッシュすることがあります(プログラマブルースの精度のおかげで)。

9

最適化されたコードは、これは動作します:

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

このコードは動作します。次に、必要に応じてosName変数を使用します。

-1

次の機能を試すことができます。

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

あなた自身のウェブサイトやブログを宣伝したい場合は注意してください。**あなたは答えにあなたの所属を開示する必要があります**。さもなければ、あなたの答えは迷惑メールとして警告されるかもしれません。 [スパマーにならない方法](https://stackoverflow.com/help/promotion)をお読みください。 – iBug

0

私はAPIに19

を実行しているエミュレータで試してみましたときに反射が働いていないので、私は「ナチョ・コロマ」と「ケビン・グラント」のハイブリッド答えを思い付く

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"; 
} 
関連する問題