2012年3月8日木曜日

システム情報

前々回、APIレベルやOSのバージョンの話をしましたので、今回はOSのシステム情報(システムのビルド情報)を取得する方法について書いてみます。

システム情報はBuildクラスを参照します。Build.VERSIONクラスでは、OSバージョンやAPIレベルを取得できます。バージョンによってフィールド(プロパティ)が追加されていたり、フィールドの代わりにメソッドを使うことが推奨されています。手元の端末のバージョンに応じて、使えるフィールドだけ参照すればいいのですがそれでは汎用的ではありません。いつもはプロジェクトの設定はAndroid 2.1以降で使えるようにしていますが、それではAndroid 2.2や4.0で追加されたものが使えませんので、今回はどのバージョンでも動くようにビルドします。

Androidプロジェクトの設定
プロジェクト名:BuildInfoTest1
ビルドターゲット:Android 4.0
アプリケーション名:BuildInfoTest1
パッケージ名:jp.co.triware.samples.BuildInfoTest1
アクティビティーの作成:BuildInfoTest1Activity
最小SDKバージョン:1
ビルドターゲットにAndroid 4.0を、最小SDKバージョンには1を指定しています。最小SDKバージョンを指定しないとビルドターゲットで指定したバージョン以降(今回であれば、API Level 14、Android 4.0以降)でしか動かなくなりますのでご注意を。

BuildInfoTest1Activity.java
package jp.co.triware.samples.BuildInfoTest1;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

public class BuildInfoTest1Activity extends Activity {
    private static final String TAG = "BuildInfoTest1";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Build
        Log.d(TAG, "Build.BOARD: " + Build.BOARD);
        try {
            Log.d(TAG, "Build.BOOTLOADER: " + Build.BOOTLOADER); // Lv8
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.BRAND: " + Build.BRAND);
        try {
            Log.d(TAG, "Build.CPU_ABI: " + Build.CPU_ABI); // Lv4
        } catch (NoSuchFieldError e) {
            ;
        }
        try {
            Log.d(TAG, "Build.CPU_ABI2: " + Build.CPU_ABI2); // Lv8
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.DEVICE: " + Build.DEVICE);
        try {
            Log.d(TAG, "Build.DISPLAY: " + Build.DISPLAY); // Lv3
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.FINGERPRINT: " + Build.FINGERPRINT);
        try {
            Log.d(TAG, "Build.HARDWARE: " + Build.HARDWARE); // Lv8
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.HOST: " + Build.HOST);
        Log.d(TAG, "Build.ID: " + Build.ID);
        try {
            Log.d(TAG, "Build.MANUFACTURER: " + Build.MANUFACTURER); // Lv4
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.MODEL: " + Build.MODEL);
        Log.d(TAG, "Build.PRODUCT: " + Build.PRODUCT);
        try {
            Log.d(TAG, "Build.RADIO(deprecated): " + Build.RADIO); // Lv8 (-> Lv14: method)
        } catch (NoSuchFieldError e) {
            ;
        }
        try {
            Log.d(TAG, "Build.SERIAL: " + Build.SERIAL); // Lv9
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.TAGS: " + Build.TAGS);
        Log.d(TAG, "Build.TIME(long): " + Build.TIME);
        Log.d(TAG, "Build.TYPE: " + Build.TYPE);
        Log.d(TAG, "Build.USER: " + Build.USER);
        try {
            Log.d(TAG, "Build.getRadioVersion(): " + Build.getRadioVersion()); // Lv14
        } catch (NoSuchMethodError e) {
            ;
        }

        // Build.VERSION
        try {
            Log.d(TAG, "Build.VERSION.CODENAME: " +  Build.VERSION.CODENAME); // Lv4
        } catch (NoSuchFieldError e) {
            ;
        }
        Log.d(TAG, "Build.VERSION.INCREMENTAL: " +  Build.VERSION.INCREMENTAL);
        Log.d(TAG, "Build.VERSION.RELEASE: " + Build.VERSION.RELEASE);
        Log.d(TAG, "Build.VERSION.SDK(deprecated): " + Build.VERSION.SDK); // (-> Lv4: SDK_INT)
        try {
            Log.d(TAG, "Build.VERSION.SDK_INT(int): " + Build.VERSION.SDK_INT); // Lv4
        } catch (NoSuchFieldError e) {
            ;
        }
    }
}
"// Lv4"のようなコメントを付けたところは、"API Level 4で追加"されたフィールドです。
"RADIO"はAPI Level 8で追加されましたが、API Level 14でメソッド(getRadioVersion())に変更されました。
対応していないバージョンでフィールドを参照したりメソッドを実行すると例外が発生しますので、try-catchで対応します。
"SDK"はAPI Level 4で追加された"SDK_INT"に変更されました。どちらも値は数字です(SDKはString型で、SDK_INTはint型で持っています)。

実行結果
Build.BOARD: N-04C
Build.BOOTLOADER: 0
Build.BRAND: DOCOMO
Build.CPU_ABI: armeabi-v7a
Build.CPU_ABI2: armeabi
Build.DEVICE: N-04C
Build.DISPLAY: GINGERBREAD
Build.FINGERPRINT: DOCOMO/N-04C/N-04C:2.3.3/A1030401/eng.20111117.100533:user/release-keys
Build.HARDWARE: n-04c
Build.HOST: NCmobile
Build.ID: A1030401
Build.MANUFACTURER: NEC
Build.MODEL: N-04C
Build.PRODUCT: N-04C
Build.RADIO(deprecated): unknown
Build.SERIAL: ***************
Build.TAGS: release-keys
Build.TIME(long): 1321492034000
Build.TYPE: user
Build.USER: NCmobile
Build.VERSION.CODENAME: REL
Build.VERSION.INCREMENTAL: eng.20111117.100533
Build.VERSION.RELEASE: 2.3.3
Build.VERSION.SDK(deprecated): 10
Build.VERSION.SDK_INT(int): 10
ドコモのN-04Cで実行した結果です。シリアル番号は伏字にしています。
N-04Cは元々Android 2.2でしたが、2.3.3にアップグレードしています。Android 2.3.3はAPI Level 10ですので、API Level 14で追加されたgetRadioVersion()は例外が発生して表示していません。
Build.TIMEは、1970年1月1日00:00:00GMTからのミリ秒ですので、
Log.d(TAG, "Build.TIME(long): " + Build.TIME);

Date d = new Date(Build.TIME);
Log.d(TAG, "Build.TIME: " + Build.TIME + " (" + d.toString() + ")");
に変更することで、日時に変換して表示できます。

なお、それぞれのフィールドの意味については、Android Developersのサイトをご覧ください。
http://developer.android.com/reference/android/os/Build.html
http://developer.android.com/reference/android/os/Build.VERSION.html

0 件のコメント:

コメントを投稿