Intentを発行して画像を選択orカメラで撮影して、画像を表示させる
端末内に保存されている画像を表示したり、もしくはその場でカメラで撮影した画像を表示させる方法です。
例えばSNSへ投稿する画像を選択したりするのに使うことが考えられますかね。
やり方としてはIntentを発行して、startActivityResult()
で結果を受け取って表示させるようになります。
画像の選択とカメラでの撮影は異なるアクションなので、1つのIntentで表現するにはIntent.createChooser()
で複数のIntentをひとまとめにして発行することになります。
やってみると、カメラで撮影した画像を受け取るのにちょっと工夫が必要なだけで、割と簡単に実装できました。
Getting a Result from an Activity – Android Developers
Intent pickPhotoIntent = new Intent()
.setType("image/*")
.setAction(Intent.ACTION_GET_CONTENT);
カメラで撮影する場合、以下のIntentでも撮影→その画像を受取ることができますが、そのままでは画像サイズがとても小さくなってしまいます。(サムネイルサイズの小さな画像が返ってくる)
Intent takePhotoIntent = new Intent()
.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooserIntent = Intent.createChooser(pickPhotoIntent, "画像を選択");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,new Intent[]{takePhotoIntent});
作成したIntentの1つを元にしてcreateChooser()
を呼び出して作成したIntentに、Intentの配列を埋め込みます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_GET_IMAGE && resultCode == Activity.RESULT_OK) {
if (data != null) {
Bitmap image = null;
if (data.getExtras() != null && data.getExtras().get("data") != null) {
image = (Bitmap) data.getExtras().get("data");
mImageView.setImageBitmap(image);
} else {
try {
InputStream stream = getContentResolver().openInputStream(data.getData());
image = BitmapFactory.decodeStream(stream);
mImageView.setImageBitmap(image);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
Intentによって選択されたファイルは、当該ファイルを一意に識別するためのUriがIntentに埋め込まれて返ってきます。これはdata.getExtra()で取得できます。上記の例ではBitmapファイルとして取得して、独自View(mImageView)に渡しています。
一方でカメラで撮影した画像は、直接画像データがdata.getExtras().get("data")
で取得できます。ただしこの画像はサムネイル用の小さな画像です。
オリジナルの画像データは大きすぎて、Intentを経由しての受け渡しができないからです。カメラで撮影したオリジナルサイズの画像を受け渡しするには一工夫必要です。長くなるので別に書きます。