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/
読み込んだバーコードはたまたま近くにあった「激落ちキング」です。これも凄く良いものです。