AndroidOSバージョンごとの処理切り替え方法

どうもこんにちは、ちはるです。

ちまちま調べつつAndroidアプリを制作中な今日この頃なのですが、AndroidOSのバージョン(APIレベル)ごとに、使えるクラスが異なったりするんですよね。

ということで、今回はビルドバージョンごとに処理を分岐させる方法について簡単に忘備録をまとめます。

※当記事ではサンプルコード等の言語にJavaを使用しています

 

AndroidOSバージョンごとの世界シェア

世界中のAndroid端末で使用されているOSバージョンにも結構バラつきがあるようで、シェアとしては以下の通りだそう。

参考:Distribution dashboard  |  Android Developers

AndroidOSのバージョンごとの世界シェア

AndroidOSのバージョンごとの世界シェア

データが2018年10月のものなので今現在ではまた変わってくるのでしょうが、このデータを見た限り、KitKat(バージョン4.4)あたりまでは考慮に入れてアプリ制作を行う必要がありそうだなぁ、というのが個人的な所感です。

まずはサンプル

ひとまず、サンプルを記載します。
端末OSごとによる処理の分岐は、以下のような感じで行います。

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

    // AndroidOSバージョンが8.0以上の端末用処理

} else {
            
    // それ以外の端末用処理

}

そのまんまと言えばそのまんまですね。

以下からは、こちらのサンプルコードをもとに各部について説明を書いていきます。

Build.VERSIONクラスを使おう

Build.VERSIONとは、読んで字のごとくですが、ビルドバージョンに関する情報を扱うクラスです。

このクラスを使用することで、端末ごとのOS情報を参照できたりします。

ユーザ端末のOSバージョンを取得する

まずはユーザ端末のOSバージョンを取得する方法。

これは、Build.VERSION.SDK_INTを使用することで可能です。

The SDK version of the software currently running on this hardware device. This value never changes while a device is booted, but it may increase when the hardware manufacturer provides an OTA update.
Possible values are defined in Build.VERSION_CODES.


Androidリファレンスより)

雑ですが日本語訳しました↓

ハードウェア上で現在稼働中のソフトウェアのSDKバージョン。
この値はデバイスの起動中は決して変化しないが、メーカーによる(OSの)アップデートが行われた場合、値が増加かもしれない。
考え得る値はBuild.VERSION_CODESに定義されている。

Build.VERSION_CODESについて

Build.VERSION_CODEは、現在リリースされているAndroidOSバージョンの列挙型になります。

サンプルコードではBuild.VERSIONとの比較対象としてBuild.VERSION_CODES.Oを使用していますが、これというのはリファレンスを参照すると次の通りとなります。

Build.VERSION_CODES.Oのリファレンス

OはOreoの頭文字、つまり数字でいうとバージョン8.0をさしています。

この他にバージョン7.0はN(Nougat)であったり、バージョン9はP(Pie)であったりするので、詳しい列挙型の内容はリファレンスで確認してみてください。

 

 

その他

int型の数値を使うことも可能

サンプルのBuild.VERSION_CODES.Oで言うと、定数の値はint型の26*1になります。

このことから、Build.VERSION.SDK_INTとの比較ではBuild.VERSION_CODESを使わず、次のように数字を使うことも可能です。

if (Build.VERSION.SDK_INT >= 26) {

    // AndroidOSバージョンが8.0以上の端末用処理

} else {
            
    // それ以外の端末用処理

}

そもそもどう言うときに分岐させるのか

例えば、従来のJavaでいうと日付/時間を扱うにはDate/Calender/DateFormat等のクラスを使用していました。

が、Java8からは日時を扱う新しいAPIとしてjava.time.LocalDateTimeなどといったクラスが登場しました。

なのでAndroid Oreo(APIレベル26)からはこの新しいAPIの使用が推奨されているわけですが、Android Nougat(APIレベル25)以前のOSを積んでいるAndroid端末では新APIが動かせないので、従来のAPIで日付データを取り扱う必要があります。

そんなときに、ユーザの端末OSごとに処理を分岐させてやる必要があるんですね。

// 現在時刻を取得
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // AndroidOS_8.0以上の端末用処理

    // 新APIを使用
    LocalDateTime localDateTime = LocalDateTime.now();

} else { // それ以外の端末用処理

    // 旧APIを使用
    Date date = new Date();

}

こんな感じ。

おわりに

ということで、ユーザのAndroid端末OSごとに処理を分岐させる方法でした。

記事の初めの方で紹介したとおり、ユーザが使うOSのバージョンがてんでバラバラなので、アプリ制作者側は考えることが多くて大変だなぁ、と。

僕自身、Androidアプリの開発はまだまだ探り探りな状況なので、もっと別にOSについて考慮するべき機会などもあるのかもしれませんが、そう言ったときも柔軟に対応していきたいものです。

ではでは、ここまで読んで下さりありがとうございましたー!

 

 

 

 

*1:26という数値はAPIレベルの数値です。ややこしい