Abrufen des Pfads des aufgenommenen Bilds in Android mithilfe der Kameraabsicht

Lesezeit: 6 Minuten

Abrufen des Pfads des aufgenommenen Bilds in Android mithilfe der
Schubham

Ich habe versucht, den Pfad des aufgenommenen Bildes zu erhalten, um das Bild zu löschen. Habe viele Antworten auf StackOverflow gefunden, aber keine davon funktioniert für mich. Ich bekam folgende Antwort:

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

Dieser Code funktioniert im Samsung-Tab, aber nicht im Lenovo-Tab und im i-Ball-Tab. Kann mir also jemand helfen, eine andere Lösung zu finden, um dasselbe zu tun? Jede Hilfe wird geschätzt. Danke schön.

Das ist mein 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();
        }
    }
}

1643692986 362 Abrufen des Pfads des aufgenommenen Bilds in Android mithilfe der
Aamir Khan

Versuchen Sie es so

Übergeben Sie die Kameraabsicht wie unten

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

Und nach dem Capturen ein Bild schreiben OnActivityResult wie nachstehend

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

Und Protokoll prüfen.

Bearbeiten:

Viele Leute fragen, wie man kein Thumbnail bekommt. Sie müssen diesen Code stattdessen für die hinzufügen getImageUri Methode:


    public Uri getImageUri(Context inContext, Bitmap inImage) {
        Bitmap OutImage = Bitmap.createScaledBitmap(inImage, 1000, 1000,true);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), OutImage, "Title", null);
        return Uri.parse(path);
    }

Die andere Methode komprimiert die Datei. Sie können die Größe anpassen, indem Sie die Zahl ändern 1000,1000

  • Android Camera Intent ist wie Intent Intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    – Schubham

    2. Dezember 13 um 12:08 Uhr


  • wofür steht “mImageCaptureUri”??

    – Dushyant Patel

    12. April 14 um 0:40 Uhr

  • Der obige Code erstellt ein Miniaturbild. Wie kann ich ein Bild in voller Größe aus dem obigen Code erhalten?

    – Nisar Ahmad

    18. März 16 um 10:56 Uhr

  • MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, “data”, null); Diese Zeile gibt mir null

    – cammando

    15. Februar 17 um 10:25 Uhr


  • Der obige Code erstellt ein Miniaturbild @ArthurZhixinLiu

    – Aamir Khan

    4. Oktober 17 um 6:53 Uhr

Abrufen des Pfads des aufgenommenen Bilds in Android mithilfe der
dzikovskyy

Es gibt eine Lösung, um eine Datei zu erstellen (in einem externen Cache-Verzeichnis oder an einem anderen Ort) und den URI dieser Datei als zusätzliche Ausgabe für die Kameraabsicht zu speichern. Dadurch wird der Pfad definiert, in dem das aufgenommene Bild gespeichert wird.

Hier ist ein Beispiel:

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

            }
        }
    }

Wenn Sie die Datei dann nicht mehr benötigen, können Sie sie mit löschen file.delete();

Übrigens werden Dateien aus dem Cache-Verzeichnis entfernt, wenn der Benutzer den App-Cache aus den App-Einstellungen löscht.

Versuchen Sie diese Methode, um den Pfad zu erhalten original Bild von der Kamera aufgenommen.

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

Diese Methode gibt den Pfad des letzten von der Kamera aufgenommenen Bildes zurück. Dieser Weg wäre also von Original Bild nicht von Miniaturansicht Bitmap.

  • Was ist, wenn kein externer Speicher vorhanden ist?

    – cammando

    15. Februar 17 um 11:41 Uhr

  • Ich bekomme damit sehr schlechte Qualität

    – Jaroslaw Dukal

    8. August 17 um 10:52 Uhr

Hier habe ich den Beispielcode in Kotlin aktualisiert. Bitte beachten Sie die Version Nougat und höher Uri.fromFile(file) funktioniert nicht und es stürzt die App ab, da FileProvider implementiert werden muss, was der sicherste Weg ist, Dateien von Absicht zu senden. Um dies zu implementieren, verweisen Sie auf diese Antwort oder diese Artikel

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

Bitte beachten Sie die Google-Dokumentation:
Kamera – Fotogrundlagen

Versuche dies

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 + "");

zum Aufnehmen von Bildern:

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

.

723310cookie-checkAbrufen des Pfads des aufgenommenen Bilds in Android mithilfe der Kameraabsicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy