2014年4月9日水曜日

「ギャラリーから選択」と「カメラで撮影」を1つのchooserで表示する。

異なるActionのIntentそれぞれに対応するアプリを、1つのchooserで選択できるようにする方法です。


例えば、ギャラリーから画像を選択するときは 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 件のコメント:

コメントを投稿