Intention de la caméra Android

Réponses:

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());
            }
        }
    }
}
Alexandre Oleynikov
la source
5
Cela fonctionne très bien, bien que vous ayez besoin de: private static int TAKE_PICTURE = 1;
Chris Rae
11
NE FONCTIONNE PAS SUR LES TÉLÉPHONES GALAXY S :(
UMAR-MOBITSOLUTIONS
1
Pourquoi le codé en dur «android.media.action.IMAGE_CAPTURE». Cela peut ne pas fonctionner sur certains téléphones. Existe-t-il une norme pour cela? Peut-être quelque chose autour de Intent.ACTION_GET_CONTENT?
AlikElzin-kilaka
7
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob
2
Vous devrez peut-être utiliser FileProviderdans Android> M. Voir ici
Nicolai Weitkemper
22

Essayez ce qui suit que j'ai trouvé ici

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
la source
2
Merci, mais la photo prise n'est pas enregistrée sur un appareil, donc j'obtiens FileNotFoundException dans Uri uri = Uri.parse (data.toURI ()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov
Êtes-vous en train de dire que la photo que vous prenez n'est pas stockée sur le téléphone / appareil par votre choix ou que quelque chose se passe et même si vous lui dites de stocker l'image sur votre téléphone / appareil, il agit comme si elle ne sauvegardait pas?
Ryan
Je dis que l'image n'est pas stockée automatiquement sur l'appareil, mais revient sous forme de bitmap dans onActivityResult (). Cependant, j'ai trouvé une solution que je mentionnerai dans une réponse.
Alexander Oleynikov
C'est la meilleure réponse. La réponse supérieure enregistre une copie inutile de l'image. Cela apparaît dans l'application de la galerie de l'utilisateur sous forme de deux images au lieu d'une, ce que la plupart des gens considéreraient comme un bogue.
Thomas Dignan
7

Il m'a fallu quelques heures pour que cela fonctionne. Le code est presque un copier-coller de developer.android.com , avec une différence mineure.

Demandez cette autorisation sur AndroidManifest.xml:

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

Sur votre Activity, commencez par définir ceci:

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

Puis tirez ceci Intentdans 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);
    }
}

Ajoutez la méthode de support suivante:

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

Puis recevez le résultat:

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

Ce qui l'a fait fonctionner, c'est le MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), qui est différent du code de developer.android.com . Le code d'origine m'a donné un FileNotFoundException.

Albert Vila Calvo
la source
Pareil pour moi. Vous m'avez sauvé quelques heures je suppose. Une idée de la raison pour laquelle le code Android Dev donne une exception IO?
Coo
0

Essayez ce qui suit, j'ai trouvé Voici un lien

Si votre application cible M et au-dessus et déclare utiliser l'autorisation CAMERA qui n'est pas accordée, alors la tentative d'utilisation de cette action entraînera une 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
la source
Dans cette bibliothèque, il n'y a aucun moyen de définir le chemin de sortie pour la photo et il y a aussi quelques bugs comme il me semblait
Vlad
0

J'ai trouvé un moyen assez simple de le faire. Utilisez un bouton pour l'ouvrir en utilisant un on clickécouteur pour démarrer la fonction openc(), comme ceci:

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
    }
}

Vous pouvez faire ce que vous voulez avec la urichaîne d'emplacement. Par exemple, je l'envoie à un rogneur d'image pour recadrer l'image.

Aishik kirtaniya
la source
-3

essayez ce code

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivityForResult(photo, CAMERA_PIC_REQUEST);
anupam sharma
la source
6
Ce message est automatiquement signalé comme étant de mauvaise qualité car il ne s'agit que de code. Pourriez-vous l'élargir en ajoutant du texte pour expliquer comment cela résout le problème?
gung - Réintégrer Monica le