LoginSignup
2
0

More than 5 years have passed since last update.

Developer Preview版でのAndroidバージョン確認

Posted at

Developer Preview版を触って自分みたいにビックリしないためにメモを残します。

Androidのバージョンを確認する際は

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            ・・・
        }

みたいに、SDK_INT の値を比較するのが一般的です。
しかし、Developer Preview版のAndroidでは、一時的にこの方法が適用できない期間があります。

Developer Preview版 と Build.VERSION の関係

今回のAndroid Oでは、DPのリリース別に以下の値でした。

API DP2 DP3
Build.VERSION.SDK_INT 25 26
Build.VERSION.CODENAME "O" "REL"
Build.VERSION_CODES.O 10000 26

DP2時点でSDK_INTの値がNougat時のままである事に注意してください。CODENAMEの値もドキュメントにあるような"REL"でなく"O"となっています。

これは不具合ではなく、新規のAPI仕様等がまだFixされていない場合の、典型的な振る舞いになります。とのことです。
(https://issuetracker.google.com/issues/36973990#comment2)

Android OではDP3にてAPIがFinal宣言されました。このバージョンからは、一般的なSDK_INTによる比較でAndroidバージョンが判別可能です。

不安定時期のAndroidバージョン確認

さて、DP2のような不安定時期のAndroidバージョン確認は、どうすれば良いかというと、サポートライブラリで提供される BuildCompat.isAtLeastO() が、そこそこに有用です。

DP2時点で提供されていた com.android.support:support-v4:26.0.0-beta1 では、このメソッドの実装が CODENAMEの比較に基づく実装になっており、Android OのAPIレベルである事が判別できます。

    public static boolean isAtLeastO() {
        return !"REL".equals(VERSION.CODENAME)
                && ("O".equals(VERSION.CODENAME) || VERSION.CODENAME.startsWith("OMR"));
    }

なおDP3時点で提供された com.android.support:support-v4:26.0.0-beta2 では、このメソッドの実装は 一般的なSDK_INTの比較に基づく実装になっており、かつ Deprecatedになりました。なんとも忙しいメソッドですね。

ちょっとした注意事項

使用しているROMと、サポートライブラリのバージョンの組み合わせは注意が必要です。自分は動かしてないですが、DP3の値と、上記で紹介したbeta1時のisAtLeastO()の実装の組み合わせでは、期待する結果(true)にならないのが予想できます。

isAtLeastO()のメソッドは、サポートライブラリ(β版に限定されるかと思いますが)の中でも、バージョン別の処理を行うために使用されるため、isAtLeastO()の判定結果が正しくないと、サポートライブラリのAPIも正しく動作しない場合がでてきます。

アプリに組み込んだサポートライブラリのバージョンが、正しく動作するバージョンとなっているか、要所要所で気にしておくと良いかと思います。

最後に、バージョンの現状値をログ出力するコード例を紹介します。

    void checkVersions() {
        Log.d(TAG, "checkVersions: ");
        Log.d(TAG, "checkVersions: " + "Build.VERSION.SDK_INT=" + Build.VERSION.SDK_INT);
        Log.d(TAG, "checkVersions: " + "Build.VERSION.PREVIEW_SDK_INT=" + Build.VERSION.PREVIEW_SDK_INT);
        Log.d(TAG, "checkVersions: " + "Build.VERSION.CODENAME=" + Build.VERSION.CODENAME);
        Log.d(TAG, "checkVersions: " + "Build.VERSION_CODES.O=" + Build.VERSION_CODES.O);
        Log.d(TAG, "checkVersions: " + "getApplicationInfo().targetSdkVersion=" + getApplicationInfo().targetSdkVersion);
        Log.d(TAG, "checkVersions: " + "BuildCompat.isAtLeastO()=" + BuildCompat.isAtLeastO());
        Log.d(TAG, "checkVersions: " + "BuildCompat.isAtLeastOMR1()=" + BuildCompat.isAtLeastOMR1());
    }
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0