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