プログラムによるAndroid APIバージョンの取得


回答:


1067

Androidのドキュメントで説明されているように、電話が実行されているSDKレベル(整数)は次の場所で利用できます。

android.os.Build.VERSION.SDK_INT

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

コード例:

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
}

編集:このSDK_INTはドーナツ(android 1.6 / API4)以降で使用できるため、使用する場合、アプリケーションがCupcake(android 1.5 / API3)とレトロコンパチブルでないことを確認してください。 。

対応するAndroidドキュメントはこちらこちら


18
コードが1.5で実行されている場合、API 4で導入されたため、SDK_INTを参照すると例外がスローされます(はい、API 4コードでコンパイルされたAPKを1.5で実行できます。そして、そのAPI 4コードに到達すると、それは例外をスローします。)
プログラマブルース

@ProgrammerBruceクラッシュを防ぐ方法は?またはどのようにレトロコンパチブルにならないのですか?
・クール

1
@CœurAndroid 1.5と互換性のあるレトロなアプリを構築することは、今日ではあまり役に立ちません。プロジェクトminSdkVersion4(Android 1.6)に設定して続行します。
ol_v_er

代わりにString android.os.Build.VERSION.SDKを使用しないのはなぜですか?それはすべてのAndroidバージョンで動作します
PYK '10 / 10/30

@PYKこの属性android.os.Build.VERSION.SDKは非推奨であるため、使用しないでください。developer.android.com/reference/android/os/…–
ol_v_er

146

非常に簡単:

   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

2
Build.VERSION.RELEASEは私が探していたものです。ありがとう@CommonSenseCode
axierjhtjz

81
Build.VERSION.RELEASE;

これにより、バージョンの実際の数がわかります。別名2.3.3または2.2。Build.VERSION.SDK_INTを使用する場合の問題は、ルート化された電話またはカスタムromを使用している場合、非標準のOS(別名Androidが2.3.5を実行している)が存在する可能性があり、Build.VERSION.SDK_INTを使用するとnullが返されます。そのため、Build.VERSION.RELEASEは、標準のAndroidバージョンを使用してもしなくても機能します。

それを使用するには、これを行うだけです。

String androidOS = Build.VERSION.RELEASE;

9
ドキュメントによるint android.os.Build.VERSION.SDK_INTpublic static final int SDK_INTAdded in API level 4(整数ではなく)intはどのように返すことができNULLますか?NULLはオブジェクトの状態なので、そのBuildまたはVERSIONはnull理論的には可能ですが、そのような場合だけでSDK_INTなくRELEASE、NPEも引き起こします。SDK_INTは、おそらく「そのようなメソッド例外はありません」またはそのような何かを引き起こす可能性がありますが、nullまたはNPEではありません。カスタムROMだけがドキュメントととして宣言されたメソッドを壊す場合public static final Integer SDK_INT。回避策を作成するために、問題の性質を特定しようとしています。
2013

3
これが実際に事実であるかどうか誰でも確認できますか?スタンのコメントはnullが不可能であることをかなり明確にします。そして、カスタムAndroid ROM / OSは確かにバージョンのビルドに由来する必要がありますか?だから確かにBuild.VERSION.SDK_INTはこれを反映するべきですか?
BT

3
申し立てが実際には裏付けられてnullおらず、警告が意味をなさないため、私はこれに反対票を投じました。
サム

根ざした電話またはカスタムROMがこの番号に触れないようにしてください。ただし、通常はBuild.VERSION.RELEASEを変更します。
Phuah Yee Keat 2016

カスタムOS / ROMに関しては、多くの既知の問題があります。私が当時古いAndroidで使用していたバージョン(GS3と言いたい)には、この問題がありました。ハードコードされた値や、正しくなかった値には多くの問題がありました。難しい例、Wi-Fi Macアドレスはハードコードされています。
Falcon165o 2016年

31

すべてのことを考慮に入れて、デバイスがFroyo以降のAndroid OS(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;
}

当然のことながら、汎用のチェッカーが必要な場合に備えて、Androidの1.0および1.5バージョンを考慮に入れるようにif条件を変更できます。あなたはおそらく次のようなものになるでしょう:

// 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;
    }
}

コードが機能しない場合はお知らせください。


29

これを試して:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
 }

9

android.os.Build.VERSION.SDKは、APIレベルの値を提供します。Androidのドキュメントで、APIレベルからAndroidバージョンへのマッピングを簡単に見つけることができます。8は2.2用、7は2.1用などと思います。


このメソッドは非推奨です。
2018

4

とった。クラスのgetApplicationInfo()メソッドを使用していContextます。


1
これにより、APKのminSdkVersionおよびtargetSdkVersionが取得されます。これは、アプリがサポートするAPIバージョンを示します。これは、アプリが現在実行されている電話のAPIバージョンではありません。
OldSchool4664 2016年

2

SDK.INTはAndroid 1.6以上でサポートされています

SDKはすべてのバージョンでサポートされています

私もです:

String sdk_version_number = android.os.Build.VERSION.SDK;

クレジット:この回答に対するCommonsWare


SDKはJavaで非推奨になりました。
limonik

0

私はこれを書いたよりも簡単な方法でバージョンを持っている方が好きです:

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

0

その実用的なハッピーコーディング

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

インポートパッケージが正しいことを確認してください(インポートパッケージはアプリケーションパッケージ名です。そうでない場合、正しく機能しません)。


-2

使用したコードを改善しました

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.