例えば、ギャラリーから画像を選択するときは Intent.ACTION_GET_CONTENT を使いますが、 カメラを起動して撮影した画像を取得するときは MediaStore.ACTION_IMAGE_CAPTURE を使います。
そのため、まず「ギャラリーから選択」と「カメラで撮影」のどちらかを選ぶためのダイアログを用意する例をよく見ます。
*ドキュメントプロバイダーが追加されたからか、ACTION_GET_CONTENT でギャラリーが出てこなくなり、代わりにドキュメントがでてきます。ここではギャラリーの方がわかりやすいので、ギャラリーとします。
Intent.EXTRA_INITIAL_INTENTSを使えば、1つのchooserダイアログに両方入れることができます。
private Uri mPictureUri;
private void launchChooser() {
// ギャラリーから選択
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.setType("image/*");
i.addCategory(Intent.CATEGORY_OPENABLE);
// カメラで撮影
String filename = System.currentTimeMillis() + ".jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
mPictureUri = getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent i2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i2.putExtra(MediaStore.EXTRA_OUTPUT, mPictureUri);
// ギャラリー選択のIntentでcreateChooser()
Intent chooserIntent = Intent.createChooser(i, "Pick Image");
// EXTRA_INITIAL_INTENTS にカメラ撮影のIntentを追加
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { i2 });
startActivityForResult(chooserIntent, IMAGE_CHOOSER_RESULTCODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CHOOSER_RESULTCODE) {
if (resultCode != RESULT_OK) {
if (mPictureUri != null) {
getContentResolver().delete(mPictureUri, null, null);
mPictureUri = null;
}
return;
}
// 画像を取得
Uri result = (data == null) ? mPictureUri : data.getData();
ImageView iv = (ImageView) findViewById(R.id.imageView1);
iv.setImageURI(result);
mPictureUri = null;
}
}
* MediaStore.ACTION_IMAGE_CAPTURE を使うときは android.permission.WRITE_EXTERNAL_STORAGE が必要なので忘れずに
0 件のコメント:
コメントを投稿