Intención de la cámara de Android

Respuestas:

178
private static final int TAKE_PICTURE = 1;    
private Uri imageUri;

public void takePhoto(View view) {
    Intent intent = new Intent(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);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case TAKE_PICTURE:
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImage = imageUri;
            getContentResolver().notifyChange(selectedImage, null);
            ImageView imageView = (ImageView) findViewById(R.id.ImageView);
            ContentResolver cr = getContentResolver();
            Bitmap bitmap;
            try {
                 bitmap = android.provider.MediaStore.Images.Media
                 .getBitmap(cr, selectedImage);

                imageView.setImageBitmap(bitmap);
                Toast.makeText(this, selectedImage.toString(),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                        .show();
                Log.e("Camera", e.toString());
            }
        }
    }
}
Alexander Oleynikov
fuente
5
Esto funciona muy bien, aunque es posible que necesite: private static int TAKE_PICTURE = 1;
Chris Rae
11
NO FUNCIONA EN TELÉFONOS GALAXY S :(
UMAR-MOBITSOLUTIONS
1
Por qué el código 'android.media.action.IMAGE_CAPTURE' codificado. Es posible que no funcione en algunos teléfonos. ¿Existe un estándar para esto? ¿Quizás algo relacionado con Intent.ACTION_GET_CONTENT?
AlikElzin-kilaka
7
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob
2
Es posible que deba usar FileProvideren Android> M. Vea aquí
Nicolai Weitkemper
22

Prueba lo siguiente que encontré aquí

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 0);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode == Activity.RESULT_OK && requestCode == 0) {
    String result = data.toURI();
    // ...
  }
}
Ryan
fuente
2
Gracias, pero la foto tomada no se guarda en un dispositivo, así que obtengo FileNotFoundException en Uri uri = Uri.parse (data.toURI ()); mapa de bits = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov
¿Está diciendo que la foto que toma no se almacena en el teléfono / dispositivo por su elección o que algo está sucediendo y, aunque le dice que almacene la imagen en su teléfono / dispositivo, actúa como si no se estuviera guardando?
Ryan
Estoy diciendo que la imagen no se almacena en el dispositivo automáticamente, sino que regresa como un mapa de bits en onActivityResult (). Sin embargo, encontré una solución que mencionaré en una respuesta.
Alexander Oleynikov
Esta es la mejor respuesta. La respuesta principal guarda un duplicado innecesario de la imagen. Esto aparece en la aplicación de la galería del usuario como dos imágenes en lugar de una, lo que la mayoría de la gente consideraría un error.
Thomas Dignan
7

Me tomó algunas horas hacer que esto funcionara. El código es casi una copia y pegado de developer.android.com , con una pequeña diferencia.

Solicite este permiso en AndroidManifest.xml:

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

En su Activity, comience por definir esto:

static final int REQUEST_IMAGE_CAPTURE = 1;
private Bitmap mImageBitmap;
private String mCurrentPhotoPath;
private ImageView mImageView;

Luego dispara esto Intenten un onClick:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
        photoFile = createImageFile();
    } catch (IOException ex) {
        // Error occurred while creating the File
        Log.i(TAG, "IOException");
    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
        startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
    }
}

Agregue el siguiente método de soporte:

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  // prefix
            ".jpg",         // suffix
            storageDir      // directory
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}

Entonces recibe el resultado:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        try {
            mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath));
            mImageView.setImageBitmap(mImageBitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Lo que lo hizo funcionar es el MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), que es diferente del código de developer.android.com . El código original me dio un FileNotFoundException.

Albert Vila Calvo
fuente
Lo mismo para mi. Me salvaste unas horas, supongo. ¿Alguna idea de por qué el código de desarrollo de Android está dando una excepción de IO?
Coo
0

Intente lo siguiente que encontré Aquí hay un enlace

Si su aplicación apunta a M y superior y declara que usa el permiso CAMERA que no se otorga, entonces intentar usar esta acción resultará en una SecurityException.

EasyImage.openCamera(Activity activity, int type);

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

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
        @Override
        public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
            //Some error handling
        }

        @Override
        public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) {
            //Handle the images
            onPhotosReturned(imagesFiles);
        }
    });
}
mohit rathore
fuente
En esta biblioteca no hay forma de establecer la ruta de salida para la foto y también hay algunos errores, como me pareció
Vlad
0

Encontré una forma bastante sencilla de hacer esto. Use un botón para abrirlo usando un on clickoyente para iniciar la función openc(), así:

String fileloc;
private void openc()
{
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File f = null;
    try 
    {
        f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir());
        if (takePictureIntent.resolveActivity(getPackageManager()) != null)
        {               
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f));
            fileloc = Uri.fromFile(f)+"";
            Log.d("texts", "openc: "+fileloc);
            startActivityForResult(takePictureIntent, 3);
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 3 && resultCode == RESULT_OK) {
        Log.d("texts", "onActivityResult: "+fileloc);
        // fileloc is the uri of the file so do whatever with it
    }
}

Puede hacer lo que quiera con la uricadena de ubicación. Por ejemplo, lo envío a un recortador de imágenes para recortar la imagen.

Aishik kirtaniya
fuente
-3

prueba este código

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivityForResult(photo, CAMERA_PIC_REQUEST);
anupam sharma
fuente
6
Esta publicación se marca automáticamente como de baja calidad porque es solo código. ¿Le importaría expandirlo agregando algo de texto para explicar cómo resuelve el problema?
gung - Reincorporar a Monica