====== 暗黙のインテント ======
===== 概要 =====
インテント-殊に暗黙のインテントは、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 ファイルで、
のように、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に関して]]へ戻る。