35 Stimmen

So nehmen Sie ein Bild auf und speichern es mit der nativen Android-Kamera

Ich habe ein Problem mit der Erfassung eines Bildes und speichern Sie es von der nativen Kamera-App. Hier ist ein Beispiel für einen Teil meines Codes.

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg";
File file = new File( _path );
Uri outputFileUri = Uri.fromFile( file );

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

startActivityForResult( intent, 0 );

Nachdem das Bild aufgenommen wurde und ich zu meiner ursprünglichen Aktivität zurückgekehrt bin, ist das Bild nicht vorhanden, wenn ich über den Android DDMS File Explorer zu meiner SD-Karte navigiere. Weiß jemand, warum es nicht gespeichert wird?

29voto

ninjasense Punkte 13516

Hier ist das Endprodukt, falls noch jemand diesen Thread besucht:

public class CameraCapture extends Activity {

    protected boolean _taken = true;
    File sdImageMainDirectory;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {

            super.onCreate(savedInstanceState);         
                    File root = new File(Environment
                            .getExternalStorageDirectory()
                            + File.separator + "myDir" + File.separator);
                    root.mkdirs();
                    sdImageMainDirectory = new File(root, "myPicName");

                startCameraActivity();
            }
        } catch (Exception e) {
            finish();
            Toast.makeText(this, "Error occured. Please try again later.",
                    Toast.LENGTH_SHORT).show();
        }

    }

    protected void startCameraActivity() {

        Uri outputFileUri = Uri.fromFile(sdImageMainDirectory);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case 0:
            finish();
            break;

        case -1:

            try {
                StoreImage(this, Uri.parse(data.toURI()),
                        sdImageMainDirectory);
            } catch (Exception e) {
                e.printStackTrace();
            }

            finish();
            startActivity(new Intent(CameraCapture.this, Home.class));

        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
            _taken = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
    }

        public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
        Bitmap bm = null;
        try {
            bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
            FileOutputStream out = new FileOutputStream(imageDir);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

21voto

stealthcopter Punkte 13634

Haben Sie überprüft, wie die Ausgabe von Environment.getExternalStorageDirectory() lautet, denn wenn sie kein nachgestelltes Dateitrennzeichen (/) enthält, landet Ihr Bild in einem Verzeichnis, das sich nicht auf der SD-Karte befindet, z. B:

 /mnt/sdcardmake_machine_example.jpg

Was Sie aber wirklich wollen, ist:

 /mnt/sdcard/make_machine_example.jpg

Versuchen Sie stattdessen diesen Code:

 _path = Environment.getExternalStorageDirectory() + File.separator +  "make_machine_example.jpg";

14voto

Fedor Punkte 43061

1 . Verwenden Sie einfach

new File(Environment.getExternalStorageDirectory(),  "make_machine_example.jpg");

und machen Sie sich keine Gedanken über Trennzeichen.

2 . Hatte das gleiche Problem schon einmal. SenseUI-Telefone haben eine benutzerdefinierte Kameraanwendung, die keine Datei erstellt. Welches Gerät verwenden Sie? Möglicherweise ist das Problem bei den neuesten Geräten bereits behoben, aber es kann auch noch auftreten. Hier ist ein komplettes Beispiel, wie man es beheben kann Probleme beim Speichern eines Fotos in einer Datei .

1voto

KP_ Punkte 1849

Sie sollten nach dem Speichern des Bildes einen Medienscan durchführen

 sendBroadcast(new Intent(
            Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + Environment.getExternalStorageDirectory())));

-7voto

Gurdev Punkte 7

Fügen Sie diese Zeile in die Datei AndroidManifest.xml ein und entfernen Sie die Erweiterung make_machine_example:

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

Es beginnt mit der Aufnahme des Fotos und speichert es auf der SD-Karte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X