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ダイアログに両方入れることができます。



  1. private Uri mPictureUri;  
  2.   
  3. private void launchChooser() {  
  4.     // ギャラリーから選択  
  5.     Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  6.     i.setType("image/*");  
  7.     i.addCategory(Intent.CATEGORY_OPENABLE);  
  8.   
  9.     // カメラで撮影  
  10.     String filename = System.currentTimeMillis() + ".jpg";  
  11.     ContentValues values = new ContentValues();  
  12.     values.put(MediaStore.Images.Media.TITLE, filename);  
  13.     values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");  
  14.     mPictureUri = getContentResolver()  
  15.         .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  
  16.   
  17.     Intent i2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  18.     i2.putExtra(MediaStore.EXTRA_OUTPUT, mPictureUri);  
  19.   
  20.     // ギャラリー選択のIntentでcreateChooser()  
  21.     Intent chooserIntent = Intent.createChooser(i, "Pick Image");  
  22.     // EXTRA_INITIAL_INTENTS にカメラ撮影のIntentを追加  
  23.     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { i2 });  
  24.   
  25.     startActivityForResult(chooserIntent, IMAGE_CHOOSER_RESULTCODE);  
  26. }  
  27.   
  28. @Override  
  29. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  30.     if (requestCode == IMAGE_CHOOSER_RESULTCODE) {  
  31.   
  32.         if (resultCode != RESULT_OK) {  
  33.             if (mPictureUri != null) {  
  34.                 getContentResolver().delete(mPictureUri, nullnull);  
  35.                 mPictureUri = null;  
  36.             }  
  37.             return;  
  38.         }  
  39.   
  40.         // 画像を取得  
  41.         Uri result = (data == null) ? mPictureUri : data.getData();  
  42.         ImageView iv = (ImageView) findViewById(R.id.imageView1);  
  43.         iv.setImageURI(result);  
  44.   
  45.         mPictureUri = null;  
  46.     }  
  47. }  
* MediaStore.ACTION_IMAGE_CAPTURE を使うときは android.permission.WRITE_EXTERNAL_STORAGE が必要なので忘れずに



0 件のコメント:

コメントを投稿