インテント-殊に暗黙のインテントは、AndroidをiOSと大きく差別化している最大のものであるといえる。 コレがあるが故に、Androidはデータをアプリ間で自由に共有でき、ツイッターへ投稿する、写真を公開するなどの処理を、他のアプリに依頼する形で、実装せずとも利用できるのである。
ここでは、暗黙のインテントに関する事柄について記しておく。
プログラムから、以下のように、TypeとActionを指定して、暗黙のインテントを起動する。戻りは、onActivityResult()で受け取る。必要に応じて、requestCodeをチェックすること。
Intent gi = new Intent(); gi.setType("image/*"); gi.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(gi, GALLERY_REQUEST);
画像はURIで渡されるので、受け取ったら、InputStream経由でBitmapへと取り出す。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO 自動生成されたメソッド・スタブ super.onActivityResult(requestCode, resultCode, data); if (requestCode == GALLERY_REQUEST && resultCode == RESULT_OK) { try { URI uri = data.getData(); InputStream is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); }
インテントからデータを受け取るためには、受け取りたい Activityに Intent-filterを定義してやる必要がある。Manifest ファイルで、
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/jpeg"/> <data android:mimeType="image/jpg"/> <data android:mimeType="image/png"/> <data android:mimeType="image/gif"/> </intent-filter>
のように、action/category そして、dataを定義してやる。 画像は、image/* でも受け取ることが出来るが、動画など、期待していないタイプまで引き渡される可能性があるので、受け取りたいものだけを列記しておいた方が良いだろう。
プログラム側では、onCreate()の中で、次のようにデータを受け取る。URIはParcelableで渡されてくるので注意。Stringなどではないので、誤った受け取り方をすると、NullPointer例外などを引き起こす。
Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_SEND.equals(action)) { Bundle params = intent.getExtras(); if (params != null) { String type = intent.getType(); if (type.startsWith("image/")) { Uri uri = params.getParcelable(Intent.EXTRA_STREAM); try { InputStream is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); }
Androidに関してへ戻る。