2012年2月6日月曜日

稼働環境のバージョンを知る

稼働環境のバージョンを知る

稼働中の端末のPlatform(API level・バージョン)を取得するでも触れた、Build.VERSIONについて調べた。

結論は次のとおり。
我々のような一般的なプログラマから見て、実用的なのは、Build.VERSION.SDK_INTだけである。これ以外の定数を使う機会はない。

Build.VERSIONは稼働しているAndroidのバージョンを知るクラスである。自分のアプリのバージョンを知る道具ではない。

エミュレータの4.0.3上での実行結果は次のとおりであった。
Build.VERSION.CODENAME : REL
Build.VERSION.INCREMENTAL : 237985
Build.VERSION.RELEASE : 4.0.3
Build.VERSION.CODENAME : ICE_CREAM_SANDWICH_MR1

sample codeは次のとおりである。
String s, s1, s2, s3;
TextView tv;

s1 = "Build.VERSION.CODENAME : " + Build.VERSION.CODENAME +"\n";
s2 = "Build.VERSION.INCREMENTAL : " + Build.VERSION.INCREMENTAL +"\n";
s3 = "Build.VERSION.RELEASE : " + Build.VERSION.RELEASE +"\n";
switch(Build.VERSION.SDK_INT){
case Build.VERSION_CODES.DONUT: s = "DONUT"; break;
case Build.VERSION_CODES.ECLAIR: s = "ECLAIR"; break;
case Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1: s = "ICE_CREAM_SANDWICH_MR1"; break;
default: s = "unknown";
}
s = s1 + s2 + s3 + "Build.VERSION.CODENAME : " + s;

tv = (TextView)findViewById(R.id.Text);
tv.setText(s);

2012年2月5日日曜日

稼働中の端末のPlatform(API level・バージョン) を取得する

稼働中の端末のPlatform(API level・バージョン) を取得する

稼働しているPlatform(API level・バージョン)によって、動かなくなる機能があります。このため、自分のアプリが稼働している端末のPlatformを知る必要があります。

稼働しているPlatformによって動かなくなる例として、『「本体設定」の「音の設定」画面の表示』を挙げることができます。

概要は、「本体設定」の「音の設定」画面を表示するに書いておきました。その記事では、「Platform 2.2の場合」と「Platform 1.6の場合」を、startActivityForResultが発生するエラーによって切り分けていました。これは「エラーになるんだな」という学習にはなりますが、適切なcodeではありません。
稼働中のPlatformを取得し、そのPlatform毎に対応するのが適切です。

この問題の解決には次のサイトを見ながらcodingしていけば良いです。
Build.VERSION_CODES

sample codeは下記のとおりです。
public class SettingsActivity extends Activity
    implements
    OnClickListener
    {
    final String TAG = "me";
    Button bu;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bu = (Button)findViewById(R.id.Button);
        bu.setOnClickListener(this);
    }

    @Override
    public void onClick(View v){
        if(v==bu){
            Intent it;
            
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR){
                //Platform 2.0以上の場合
                Log.d(TAG, "Platform 2.0 and later");
                it = new Intent(Settings.ACTION_SOUND_SETTINGS);
            }
            else{
                Log.d(TAG, "Platform 2.0 before");
                it = new Intent(Settings.ACTION_DISPLAY_SETTINGS);
            }
            try{
                startActivityForResult(it, 0);
            }
            catch(ActivityNotFoundException e){
                Log.e(TAG, "ActivityNotFoundException");
            }
        }
    }
}

上記例では、Platformが2.0以上か未満かを判別しています。エミュレータをPlatform毎に用意して試してみれば良いでしょう。

なお、Platformの判別を適切に行い、かつPlatformが1.6でも稼働するアプリを作るには、次の措置を講じる必要があります。
  1. Android SDKを最新版にする。
  2. Eclipseのメニューコマンド>Project>Properties>Android>Project Build Target>platformを最新(最高)のものを選択する。
  3. AndroidManifest.xmlに次の1行を追加する。
<uses-sdk android:minSdkVersion="4"/>

上記2に書いたように、Project Build Target>platformを最新版にすることにより、codeの中でBuild.VERSION_CODES.ICE_CREAM_SANDWICHという定数を書くことができます(コンパイルエラーにならないようになります)。
上記3の措置を講じることにより、Platformが1.6でも無事稼働するようになります。