2012-04-15 15 views
75

標準の方法で、カメラから画像を選択するか、ギャラリーから取得するか(ビルドインの電話帳やSkypeなど)、ダイアログボックスを呼び出すことはできますか?ギャラリーまたはカメラから画像を選択するダイアログ

私はthisを見ましたが、コードはカメラからそれを選ぶことを示唆することなくギャラリーを開きます。

デバイス:サムスンギャラクシータブ
アンドロイド:2.3.3

+0

両方のリクエスト(Camera&Gallery)を一意のIntentにマージする目的でこの回答を見てください:http://stackoverflow.com/a/32475805/2232889 –

答えて

133

以下のコードは、写真を撮ったり、写真を撮ったり、写真を撮ったり、写真を撮ったりするために使用できます。 2つのオプションを持つダイアログを表示し、選択時に適切なコードを使用します。

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(takePicture, 0);//zero can be replaced with any action code 

をギャラリーから写真を選択するには:カメラから写真を撮り

Intent pickPhoto = new Intent(Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(pickPhoto , 1);//one can be replaced with any action code 

onActivityResultコード:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) { 
    case 0: 
     if(resultCode == RESULT_OK){ 
      Uri selectedImage = imageReturnedIntent.getData(); 
      imageview.setImageURI(selectedImage); 
     } 

    break; 
    case 1: 
     if(resultCode == RESULT_OK){ 
      Uri selectedImage = imageReturnedIntent.getData(); 
      imageview.setImageURI(selectedImage); 
     } 
    break; 
    } 
} 

最後にマニフェストファイルにこの権限を追加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+12

デフォルトのアプリを開くので、カメラのアクセス許可の必要はありません。 – tasomaniac

+0

WHATS APP EDIT PROFILEのようにカメラとギャラリーの共通チューザを作成することができます。[link] http://stackoverflow.com/questions/23825289/i-want-to-make-a-dialog-screen-like -whatsapp-profile-photo-dialog-screen ... onActivityResult()で問題が発生しました。ギャラリーからイメージを選択するかどうかを区別することはできません。どのようにしてonActivityResult()でそれらを区別することができますか?すべてのソリューション?あなたが持っているなら、私を助けてください! –

+0

@tasomaniac "デフォルトのアプリを開くので、カメラ権限は必要ありません。"これはもはや真実ではありません。 android.permission.CAMERAを使用せずにカメラのインテントを開始すると、SecurityExceptionが発生し、Android 6(5?)のアプリがクラッシュする可能性があります。 – Jeremy

5

私はそれが選択するため、そのダイアログを表示するのはあなた次第だと思います。ギャラリーの場合はそのコードを使用し、カメラの場合はthisを試してください。

+1

このサンプルでは画像が逆さまになっています – Sunny

+1

I誤ってダウンしてこの答えを投票し、それは一日のために元に戻すことはできません。何か私にできることはありますか? – Dean

+1

@Deanよく、あなたはそれをupvoteに友達に頼むことができます:) –

39

ギャラリーやカメラから画像を選択するための完全なユーティリティを作成するためのいくつかのソリューションを統合しました。ギャラリーやカメラresquestsため

  • マージされたテント:これらは(もGithub lib中)ImagePicker util gistの特徴です。
  • リサイズ大きな画像(例えば、X 1600 2500)、選択さ
  • 回転画像necesary

かのスクリーンショット:

ImagePicker starting intent

編集:ここでは、コードの断片でありますギャラリーとカメラのアプリケーションの統合されたインテントを一緒に取得します。 あなたは(Github libでも)ImagePicker util gistで完全なコードを見ることができます:

public static Intent getPickImageIntent(Context context) { 
    Intent chooserIntent = null; 

    List<Intent> intentList = new ArrayList<>(); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    takePhotoIntent.putExtra("return-data", true); 
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context))); 
    intentList = addIntentsToList(context, intentList, pickIntent); 
    intentList = addIntentsToList(context, intentList, takePhotoIntent); 

    if (intentList.size() > 0) { 
     chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1), 
       context.getString(R.string.pick_image_intent_text)); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{})); 
    } 

    return chooserIntent; 
} 

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) { 
    List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0); 
    for (ResolveInfo resolveInfo : resInfo) { 
     String packageName = resolveInfo.activityInfo.packageName; 
     Intent targetedIntent = new Intent(intent); 
     targetedIntent.setPackage(packageName); 
     list.add(targetedIntent); 
    } 
    return list; 
} 
+2

それは完璧に動作します、マリオ。どうもありがとうございます!私はLG L7であるSamsung GT-I9100でテストしましたが、Android 6搭載のNexus 6にカメラの画像を入れようとすると失敗します。解決策はImagePicker.javaの58行にこれを追加することです: boolean isCamera =(imageReturnedIntent == null imageReturnedIntent.getData()== null); –

+1

@GabrielMorenoIbarraありがとうございます。あなたはそれを修正しました、今それは私のコードにもあります。 –

+0

'getTempFile'とは何ですか?この関数の使い方は?答えを更新してください –

1

を使用すると、ギャラリーから画像を取得したり、画像をキャプチャして、コードされます、次のポートレートモードでImageViewのにそれを設定したい場合これのwiのonCreateで

..あなたを助ける()

imageViewRound.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      selectImage(); 
     } 
    }); 




    private void selectImage() { 
    Constants.iscamera = true; 
    final CharSequence[] items = { "Take Photo", "Choose from Library", 
      "Cancel" }; 

    TextView title = new TextView(context); 
    title.setText("Add Photo!"); 
     title.setBackgroundColor(Color.BLACK); 
     title.setPadding(10, 15, 15, 10); 
     title.setGravity(Gravity.CENTER); 
     title.setTextColor(Color.WHITE); 
     title.setTextSize(22); 


    AlertDialog.Builder builder = new AlertDialog.Builder(
      AddContactActivity.this); 



    builder.setCustomTitle(title); 

    // builder.setTitle("Add Photo!"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      if (items[item].equals("Take Photo")) { 
       // Intent intent = new 
       // Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

       Intent intent = new Intent(
         android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       /* 
       * File photo = new 
       * File(Environment.getExternalStorageDirectory(), 
       * "Pic.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, 
       * Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); 
       */ 
       // startActivityForResult(intent,TAKE_PICTURE); 

       Intent intents = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

       fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

       intents.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

       // start the image capture Intent 
       startActivityForResult(intents, TAKE_PICTURE); 

      } else if (items[item].equals("Choose from Library")) { 
       Intent intent = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       intent.setType("image/*"); 
       startActivityForResult(
         Intent.createChooser(intent, "Select Picture"), 
         SELECT_PICTURE); 
      } else if (items[item].equals("Cancel")) { 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 




    @SuppressLint("NewApi") 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    case SELECT_PICTURE: 
     Bitmap bitmap = null; 
     if (resultCode == RESULT_OK) { 
      if (data != null) { 


       try { 
        Uri selectedImage = data.getData(); 
        String[] filePath = { MediaStore.Images.Media.DATA }; 
        Cursor c = context.getContentResolver().query(
          selectedImage, filePath, null, null, null); 
        c.moveToFirst(); 
        int columnIndex = c.getColumnIndex(filePath[0]); 
        String picturePath = c.getString(columnIndex); 
        c.close(); 
        imageViewRound.setVisibility(View.VISIBLE); 
        // Bitmap thumbnail = 
        // (BitmapFactory.decodeFile(picturePath)); 
        Bitmap thumbnail = decodeSampledBitmapFromResource(
          picturePath, 500, 500); 

        // rotated 
        Bitmap thumbnail_r = imageOreintationValidator(
          thumbnail, picturePath); 
        imageViewRound.setBackground(null); 
        imageViewRound.setImageBitmap(thumbnail_r); 
        IsImageSet = true; 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     break; 
    case TAKE_PICTURE: 
     if (resultCode == RESULT_OK) { 

      previewCapturedImage(); 

     } 

     break; 
    } 

} 



@SuppressLint("NewApi") 
private void previewCapturedImage() { 
    try { 
     // hide video preview 

     imageViewRound.setVisibility(View.VISIBLE); 

     // bimatp factory 
     BitmapFactory.Options options = new BitmapFactory.Options(); 

     // downsizing image as it throws OutOfMemory Exception for larger 
     // images 
     options.inSampleSize = 8; 

     final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
       options); 

     Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 500, 500, 
       false); 

     // rotated 
     Bitmap thumbnail_r = imageOreintationValidator(resizedBitmap, 
       fileUri.getPath()); 

     imageViewRound.setBackground(null); 
     imageViewRound.setImageBitmap(thumbnail_r); 
     IsImageSet = true; 
     Toast.makeText(getApplicationContext(), "done", Toast.LENGTH_LONG) 
       .show(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
} 






    // for roted image...... 
private Bitmap imageOreintationValidator(Bitmap bitmap, String path) { 

    ExifInterface ei; 
    try { 
     ei = new ExifInterface(path); 
     int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_NORMAL); 
     switch (orientation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      bitmap = rotateImage(bitmap, 90); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      bitmap = rotateImage(bitmap, 180); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      bitmap = rotateImage(bitmap, 270); 
      break; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return bitmap; 
} 



private Bitmap rotateImage(Bitmap source, float angle) { 

    Bitmap bitmap = null; 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    try { 
     bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), 
       source.getHeight(), matrix, true); 
    } catch (OutOfMemoryError err) { 
     source.recycle(); 
     Date d = new Date(); 
     CharSequence s = DateFormat 
       .format("MM-dd-yy-hh-mm-ss", d.getTime()); 
     String fullPath = Environment.getExternalStorageDirectory() 
       + "/RYB_pic/" + s.toString() + ".jpg"; 
     if ((fullPath != null) && (new File(fullPath).exists())) { 
      new File(fullPath).delete(); 
     } 
     bitmap = null; 
     err.printStackTrace(); 
    } 
    return bitmap; 
} 




public static Bitmap decodeSampledBitmapFromResource(String pathToFile, 
     int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(pathToFile, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, 
      reqHeight); 

    Log.e("inSampleSize", "inSampleSize______________in storage" 
      + options.inSampleSize); 
    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeFile(pathToFile, options); 
} 




public static int calculateInSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     // Calculate ratios of height and width to requested height and 
     // width 
     final int heightRatio = Math.round((float) height 
       /(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will 
     // guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 

    } 

    return inSampleSize; 
} 




public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 






private static File getOutputMediaFile(int type) { 

    // External sdcard location 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " 
        + IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
      Locale.getDefault()).format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 






public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

・ホープお手伝いします.... !!!

7

Thisライブラリが簡単になります。

ジャストコール:

PickImageDialog.on(MainActivity.this, new PickSetup(BuildConfig.APPLICATION_ID)); 

次に、あなたの活動IPickResultを実装し、法の下にこれを上書きします。あなたは、ギャラリーやカメラから画像を選択するには、このコードを実装することができます

@Override 
public void onPickResult(PickResult r) { 
    if (r.getError() == null) { 
     imageView.setImageBitmap(r.getBitmap()); 

     //or 

     imageView.setImageURI(r.getUri()); 
    } else { 
     //Handle possible errors 
     //TODO: do what you have to do with r.getError(); 
    } 
} 
+0

恐ろしい!それは簡単に – batoutofhell

3

: -

private ImageView imageview; 
private Button btnSelectImage; 
private Bitmap bitmap; 
private File destination = null; 
private InputStream inputStreamImg; 
private String imgPath = null; 
private final int PICK_IMAGE_CAMERA = 1, PICK_IMAGE_GALLERY = 2; 

Now]ボタンのクリックイベントに、あなたは、選択画像のあなたのメソッドを呼び出すことができことができます。これは内部アクティビティのonCreateです。

imageview = (ImageView) findViewById(R.id.imageview); 
btnSelectImage = (Button) findViewById(R.id.btnSelectImage); 

//OnbtnSelectImage click event... 
btnSelectImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      selectImage(); 
     } 
    }); 

あなたのアクティビティが作成されていません。

// Select image from camera and gallery 
private void selectImage() { 
    try { 
     PackageManager pm = getPackageManager(); 
     int hasPerm = pm.checkPermission(Manifest.permission.CAMERA, getPackageName()); 
     if (hasPerm == PackageManager.PERMISSION_GRANTED) { 
      final CharSequence[] options = {"Take Photo", "Choose From Gallery","Cancel"}; 
      android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(activity); 
      builder.setTitle("Select Option"); 
      builder.setItems(options, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int item) { 
        if (options[item].equals("Take Photo")) { 
         dialog.dismiss(); 
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(intent, PICK_IMAGE_CAMERA); 
        } else if (options[item].equals("Choose From Gallery")) { 
         dialog.dismiss(); 
         Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
         startActivityForResult(pickPhoto, PICK_IMAGE_GALLERY); 
        } else if (options[item].equals("Cancel")) { 
         dialog.dismiss(); 
        } 
       } 
      }); 
      builder.show(); 
     } else 
      Toast.makeText(this, "Camera Permission error", Toast.LENGTH_SHORT).show(); 
    } catch (Exception e) { 
     Toast.makeText(this, "Camera Permission error", Toast.LENGTH_SHORT).show(); 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    inputStreamImg = null; 
    if (requestCode == PICK_IMAGE_CAMERA) { 
     try { 
      Uri selectedImage = data.getData(); 
      bitmap = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes); 

      Log.e("Activity", "Pick from Camera::>>> "); 

      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); 
      destination = new File(Environment.getExternalStorageDirectory() + "/" + 
        getString(R.string.app_name), "IMG_" + timeStamp + ".jpg"); 
      FileOutputStream fo; 
      try { 
       destination.createNewFile(); 
       fo = new FileOutputStream(destination); 
       fo.write(bytes.toByteArray()); 
       fo.close(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      imgPath = destination.getAbsolutePath(); 
      imageview.setImageBitmap(bitmap); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } else if (requestCode == PICK_IMAGE_GALLERY) { 
     Uri selectedImage = data.getData(); 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); 
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes); 
      Log.e("Activity", "Pick from Gallery::>>> "); 

      imgPath = getRealPathFromURI(selectedImage); 
      destination = new File(imgPath.toString()); 
      imageview.setImageBitmap(bitmap); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public String getRealPathFromURI(Uri contentUri) { 
    String[] proj = {MediaStore.Audio.Media.DATA}; 
    Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

Atlastは、最終的にはカメラを追加し、それを大幅に私の作品のAndroidManifest.xml

に外部記憶許可を書き、それはまたあなたのために働くことを願っています。

関連する問題