Obtenir le chemin de l'image capturée dans Android en utilisant l'intention de la caméra

j'ai essayé d'obtenir le chemin de l'image capturée dans le but de supprimer l'image. J'ai trouvé beaucoup de réponses sur StackOverflow mais aucune ne fonctionne pour moi. J'ai obtenu la réponse suivante:

private String getLastImagePath() {
    final String[] imageColumns = { MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
    Cursor imageCursor = POS.this.getContentResolver().query(
            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));
        return fullPath;
    } else {
        return "";
    }
}

ce code fonctionne dans l'onglet Samsung mais ne fonctionne pas dans L'onglet Lenovo et l'onglet I-ball. Quelqu'un peut-il m'aider à trouver une autre solution pour faire de même? Toute aide sera appréciée. Remercier.

<!-Voici mon résultat d'onActivityResult:

if (requestCode == CmsInter.CAMERA_REQUEST && resultCode == RESULT_OK) {
    //Bitmap photo = null;
    //photo = (Bitmap) data.getExtras().get("data");

    String txt = "";
    if (im != null) {
        String result = "";
        //im.setImageBitmap(photo);
        im.setTag("2");
        int index = im.getId();
        String path = getLastImagePath();
        try {
            bitmap1 = BitmapFactory.decodeFile(path, options);
            bitmap = Bitmap.createScaledBitmap(bitmap1, 512, 400, false);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] bytData = baos.toByteArray();
            try {
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            result = Base64.encode(bytData);
            bytData = null;
        } catch (OutOfMemoryError ooM) {
            System.out.println("OutOfMemory Exception----->" + ooM);
            bitmap1.recycle();
            bitmap.recycle();
        } finally {
            bitmap1.recycle();
            bitmap.recycle();
        }
    }
}
31
demandé sur TofferJ 2013-12-02 15:29:18

6 réponses

Essayez comme ceci

passez L'intention de caméra comme ci-dessous

Intent intent = new Intent(this);
startActivityForResult(intent, REQ_CAMERA_IMAGE);

et après avoir capturé l'image Écrire un OnActivityResult ci-dessous

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data"); 
        imageView.setImageBitmap(photo);
        knop.setVisibility(Button.VISIBLE);


        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        // CALL THIS METHOD TO GET THE ACTUAL PATH
        File finalFile = new File(getRealPathFromURI(tempUri));

        System.out.println(mImageCaptureUri);
    }  
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    String path = "";
    if (getContentResolver() != null) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            path = cursor.getString(idx);
            cursor.close();
        }
    }
    return path;
}

Et vérifier les log

78
répondu Aamirkhan 2018-08-24 13:35:45

il y a une solution pour créer un fichier (sur le cache externe dir ou n'importe où ailleurs) et mettre l'uri de ce fichier comme sortie supplémentaire à l'intention de l'appareil photo - cela définira le chemin où l'image prise sera stockée.

Voici un exemple:

File file;
Uri fileUri;
final int RC_TAKE_PHOTO = 1;

    private void takePhoto() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = new File(getActivity().getExternalCacheDir(), 
                String.valueOf(System.currentTimeMillis()) + ".jpg");
        fileUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        getActivity().startActivityForResult(intent, RC_TAKE_PHOTO);

    }


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

        if (requestCode == RC_TAKE_PHOTO && resultCode == RESULT_OK) {

                //do whatever you need with taken photo using file or fileUri

            }
        }
    }

alors si vous n'avez plus besoin du fichier, vous pouvez le supprimer en utilisant file.delete();

soit dit en passant, les fichiers de cache dir seront supprimés lorsque l'utilisateur efface le cache de l'application des paramètres des applications.

7
répondu dzikovskyy 2016-09-07 08:08:02

essayez cette méthode pour obtenir le chemin de original image capturée par caméra.

public String getOriginalImagePath() {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getActivity().managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection, null, null, null);
        int column_index_data = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToLast();

        return cursor.getString(column_index_data);
    }

cette méthode renvoie le chemin de la dernière image capturée par la caméra. Donc, cette voie serait de origine image pas de miniature bitmap.

2
répondu Bhargav Thanki 2016-01-09 07:12:36

ici j'ai mis à jour le code échantillon à Kotlin. Veuillez noter sur Nougat et au-dessus de la version Uri.fromFile(file) ne fonctionne pas et il bloque l'application pour ce besoin d'implémenter FileProvider qui est la façon la plus sûre d'envoyer des fichiers depuis intent. Pour la mise en œuvre de cette référer ce réponse ou article

private fun takePhotoFromCamera() {
        val isDeviceSupportCamera: Boolean = this.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
        if (isDeviceSupportCamera) {
            val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                file = File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS + "/attachments")!!.path,
                        System.currentTimeMillis().toString() + ".jpg")
//            fileUri = Uri.fromFile(file)
                fileUri = FileProvider.getUriForFile(this, this.applicationContext.packageName + ".provider", file!!)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
                    takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                }
                startActivityForResult(takePictureIntent, Constants.REQUEST_CODE_IMAGE_CAPTURE)
            }

        } else {
            Toast.makeText(this, this.getString(R.string.camera_not_supported), Toast.LENGTH_SHORT).show()
        }
    }

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
             if(requestCode == Constants.REQUEST_CODE_IMAGE_CAPTURE) {
                realPath = file?.path
                 //do what ever you want to do
            }
    }
}
1
répondu Naveen Kumar M 2018-03-02 12:20:20

l'application caméra enregistre les images automatiquement et pour obtenir cette image, nous pouvons faire comme suit:

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

        if (resultCode == Activity.RESULT_OK) {
             Uri imgUri = data.getData();
            String realPath = getRealPathFromURI(imgUri);
        }

}
 public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}
0
répondu Hamid Reza Adeli 2018-07-19 05:53:51

essayez ceci

String[] projection = { MediaStore.Images.Media.DATA };
            @SuppressWarnings("deprecation")
            Cursor cursor = managedQuery(mCapturedImageURI, projection,
                    null, null, null);
            int column_index_data = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            image_path = cursor.getString(column_index_data);
            Log.e("path of image from CAMERA......******************.........",
                    image_path + "");

pour la capture d'image:

    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);
    values.clear();
-1
répondu Invader 2013-12-02 11:49:12