isherの日記

2009-10-17

[]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のメッセージが表示されます。

f:id:isher:20091017062106p:image:medium

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

f:id:isher:20091017062107p:image:medium

読み込みに成功すると、当たり前のように元の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をバーコードの値にしています。

f:id:isher:20091017062108p:image:medium

まるでバーコード読み込み機能を自前で実装しているかのようにスマートに連携出来ました。今回は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/

読み込んだバーコードはたまたま近くにあった「激落ちキング」です。これも凄く良いものです。

激落ち キング

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/isher/20091017/1255731123