web-dev-qa-db-fra.com

Obtenir le chemin de l'image à partir de l'intention ACTION_IMAGE_CAPTURE

Salut, j'utilise ACTION_IMAGE_CAPTURE pour capturer l'image à l'aide de Intent comme suit:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(),
String.valueOf(System.currentTimeMillis()) + ".jpg"))
);
startActivityForResult(cameraIntent, 0);

J'ai besoin de stocker l'image dans une carte SD et de récupérer le chemin de cette image en utilisant la méthode onActivityResult. Je ne sais pas comment obtenir le chemin de l'image de l'image actuellement capturée.

Si quelqu'un le sait, aidez-moi.

Merci

23
iCoder86

C'est ainsi que cela fonctionne sur 2.2 (différent des versions précédentes). Au début de l'intention

        String fileName = "temp.jpg";  
        ContentValues values = new ContentValues();  
        values.put(MediaStore.Images.Media.TITLE, fileName);  
        mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  
        startActivityForResult(intent, CAPTURE_PICTURE_INTENT);

vous devez vous rappeler mCapturedImageURI.

Lorsque vous capturez une image, dans onActivityResult() utilisez cet URI pour obtenir le chemin du fichier:

            String[] projection = { MediaStore.Images.Media.DATA}; 
            Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null); 
            int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
            cursor.moveToFirst(); 
            String capturedImageFilePath = cursor.getString(column_index_data);

MISE À JOUR: Sur les nouveaux appareils Android Android, vous n'auriez pas besoin de MediaStore.EXTRA_OUTPUT, mais vous déduisez plutôt l'URI image/vidéo de data.getData () reçu de onActivityResult (..., Intent data), comme décrit joliment sous

Intention Android ACTION_IMAGE_CAPTURE

Cependant, puisque cette partie est sujette à l'adaptation du fabricant, vous pouvez toujours rencontrer des téléphones où une "ancienne" approche peut être utile.

50
Zelimir

Une autre façon, testée sur Android 2.1, est de prendre l'ID ou AbsolutePath de la dernière image de la galerie.

Cela peut se faire comme ça:

/**
 * Gets the last image id from the media store
 * @return
 */
private int getLastImageId(){
    final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
    if(imageCursor.moveToFirst()){
        int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
        String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        Log.d(TAG, "getLastImageId::id " + id);
        Log.d(TAG, "getLastImageId::path " + fullPath);
        imageCursor.close();
        return id;
    }else{
        return 0;
    }
}

Et pour supprimer le fichier:

private void removeImage(int id) {
       ContentResolver cr = getContentResolver();
        cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } );
}

Ce code était basé sur le post: Suppression d'une image de galerie après la prise de vue de l'objectif de la caméra

7
Derzu

Retirer

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  

et ajouter

Uri uri = data.getData();in onActivityResult
2
ahmad

Cette question est très ancienne mais je me bats avec le même problème depuis une demi-journée. Le problème est que votre ACTION_IMAGE_CAPTURE l'intention renverra toujours code=-1 et data=null sauf si vous définissez les autorisations suivantes pour l'application dans votre AndroidManifest.xml fichier:

<uses-permission Android:name="Android.permission.CAMERA"/>

Vous pouvez également définir les paramètres suivants si vous souhaitez enregistrer de l'audio à partir de votre application:

<uses-permission Android:name="Android.permission.RECORD_AUDIO"/>
2
Lukuluba