Diálogo para elegir la imagen de la galería o de la cámara

¿Existe una forma estándar de llamar al cuadro de diálogo con elegir entre elegir una imagen de la cámara o la de la galería (como en la guía telefónica incorporada o Skype)?

He echado un vistazo a esto, pero el código abre la galería sin sugerir que se elija desde la cámara.

Dispositivo: Samsung Galaxy Tab
Android: 2.3.3

A continuación, el código se puede usar para tomar y seleccionar una foto, y para seleccionar una foto o tomar una foto. Simplemente muestre un diálogo con dos opciones y luego de la selección use el código apropiado.

Para tomar una foto de la cámara:

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

Para elegir una foto de la galería:

 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 

Código 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; } } 

Finalmente agregue este permiso en el archivo de manifiesto:

   

He fusionado algunas soluciones para hacer una utilidad completa para elegir una imagen de Galería o Cámara. Estas son las características de ImagePicker util gist (también en una lib de Github ):

  • Intenciones fusionadas para las reclamaciones de la Galería y la Cámara.
  • Cambiar el tamaño de las imágenes grandes seleccionadas (p. Ej .: 2500 x 1600)
  • Girar imagen si es necesario

Captura de pantalla:

Intento de inicio de ImagePicker

Editar : Aquí hay un fragmento de código para juntar un Intento combinado para las aplicaciones Galería y Cámara. Puede ver el código completo en ImagePicker util gist (también en una lib de Github ):

 public static Intent getPickImageIntent(Context context) { Intent chooserIntent = null; List 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 addIntentsToList(Context context, List list, Intent intent) { List 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; } 

Esta biblioteca lo hace simple.

Solo llama:

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

Luego haga que su Actividad implemente IPickResult y anule este método a continuación.

 @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(); } } 

Creo que depende de usted mostrar ese diálogo para elegir. Para la Galería usarás ese código, y para la cámara prueba esto .

Puede implementar este código para seleccionar la imagen de la galería o cámara: –

 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; 

Ahora, al hacer clic en el evento, puede llamar a su método de seleccionar Imagen. Esto es dentro de la actividad 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(); } }); 

Fuera de tu actividad está en proceso de creación.

 // 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, finalmente agrega la cámara y escribe el permiso de almacenamiento externo en AndroidManifest.xml

Me funciona mucho, espero que también funcione para usted.

Si desea obtener la imagen de la galería o capturar la imagen y configurarla en la vista de la imagen en modo retrato, el siguiente código le ayudará a …

En 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)); } 

Espero que esto te ayudará....!!!

Si targetSdkVersion es superior a 24, FileProvider se utiliza para otorgar acceso.

Cree un archivo xml (Ruta: res \ xml) provider_paths.xml

     

Agregue un proveedor en AndroidManifest.xml

    

y reemplazar

 return Uri.fromFile(getOutputMediaFile(type)); 

A

  return FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", getOutputMediaFile(type)); 

necesita agregar el permiso externo en el archivo Manifests.xml