Intentの凄さ

AndroidにはIntentと呼ばれる概念があり、これを使うことでアプリケーションをまたいでのデータのやり取りが可能になります。
例えば、端末の電話帳データを取得したり、メーラーを立ち上げて送信画面を開いたりすることが出来るのですが、Androidがデフォルトで持っているものだけでなく、サードパーティ製のアプリケーションにおいてもIntentが公開されていれば用いる事が出来るのです。

バーコードリーダーで試してみる

今時の日本の携帯には必ず付いてるバーコードリーダーですが、Androidには付いてません。マーケットにいくつか公開されていますので、その中の「Barcode Scanner」を利用させて頂きます。http://www.androlib.com/android.application.com-google-zxing-client-android-xzA.aspx
単体で使用しても、URLのバーコードを読み取るとブラウザを立ち上げたり、商品のバーコードであれば商品検索をしてみたりと十分使えるものですが、これのバーコードを読み取る機能の部分だけ別のアプリケーションから利用する使い方も出来るのです。
以下、実際に利用してみたコードです。レイアウトはButtonとTextViewだけ配置してます。
Activity

public class main extends Activity {
    public static final int REQUEST_CODE = 1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b = (Button)findViewById(id.Button);
        b.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                try{
                    startActivityForResult(intent, REQUEST_CODE);
                }catch (ActivityNotFoundException e){
                    Toast.makeText(main.this, "not found Barcode Scanner", Toast.LENGTH_SHORT ).show();
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if( requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK){
            String contents = data.getStringExtra("SCAN_RESULT");
            TextView t = (TextView)findViewById(id.Text);
            t.setText(contents);
        }
    }
}

下のコードで、Intentを作ってバーコードリーダーを起動しています。これは「Barcode Scanner」をインストールすることで使用可能になるものなので、

                Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                try{
                    startActivityForResult(intent, REQUEST_CODE);
                }catch (ActivityNotFoundException e){
                    Toast.makeText(main.this, "not found Barcode Scanner", Toast.LENGTH_SHORT ).show();
                }

インストールされていないとActivityNotFoundExceptionが発生して、Toastのメッセージが表示されます。

インストールされていた場合、カメラのActivityが起動して、バーコードの読み込み体制に入ります。

読み込みに成功すると、当たり前のように元のActivityに戻ります。下のコードが起動していたActivityから結果を取得する箇所です。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if( requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK){
            String contents = data.getStringExtra("SCAN_RESULT");
            TextView t = (TextView)findViewById(id.Text);
            t.setText(contents);
        }
    }

TextVIewをバーコードの値にしています。

まるでバーコード読み込み機能を自前で実装しているかのようにスマートに連携出来ました。今回はIntentを指定する部分で「com.google.zxing.client.android.SCAN」という値を使いましたが、これで「Barcode Scanner」アプリ側で公開されている固定のIntentを呼び出しています。
Intentの指定方法はもっと冗長に「jpeg画像を開く」などとすることも可能で、その場合はjpeg画像を開くIntentを公開しているアプリが起動します。つまり、何のアプリで起動させるかまで指定しなくて良いのです。もし存在しなければエラーになりますし、複数あった場合はユーザーがその中から選ぶことになります。OSのファイル拡張子のようなものです。これは他のスマートフォンには無い、Androidならではと言える機能だと思います。是非、他のアプリから呼び出されるような物を作ってみたいですね。
ちなみに「Barcode Scanner」はオープンソースで開発されています。バーコード読み込み部分はもちろん、Intentの使い方やAndroidアプリの作り方の部分も凄く参考になります。http://code.google.com/p/zxing/
読み込んだバーコードはたまたま近くにあった「激落ちキング」です。これも凄く良いものです。
メラミンフォーム 激落ちキング