Die Internetagentur für Web- und App-Entwicklung

Switch to desktop Register Login

Android: Bilder der Kamera verarbeiten

Artikel bewerten
(22 Stimmen)

Im heutigen Tutorial zeigen wir, wie sich in Android die Kamera ansteuern lässt, um das geschossene Bild in der eigenen App zu nutzen und auf der SD-Karte zwischen speichern zu können.

Grundsätzlich müssen zunächstl einige Vorkehrungen getroffen werden. Das betrifft das setzen von Berechtigungen in der Manifest-Datei des Projektes, und zwar innerhalb des manifest-Tags:

 

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />

 

Verarbeiten eines Thumbnail Bildes


Die Kamera-Applikation von Android lässt sich mittels eines Intents aufrufen. Sie wartet durch den Aufruf von startActivityForResult auf die Rückgabe in Form eines Bildes. Die verwendete Zahl 42 spielt hier zunächst keine Rolle. Sie dient der Identifizierung des Aufrufers der Kamera.

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 42);


Nachdem der Schnappschuss nun genommen wurde, wird das Bild an die aufrufende Aktivität zurückgegeben. Dort kann es jederzeit an eine ImageView oder an andere grafische Elemente zugewiesen werden:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 42) {
Bitmap thumb = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(thumb);
}
}

Nachdem das Bild im Kasten ist, fällt jedoch auf, dass die Bildgröße klein Ausfällt. Das vom Intent zurückgegebene Bitmap trägt eine Breite 120 und eine Höhe von 160 Pixeln wenn das Bild im Beispiel mit einem Samsung Galaxy S aufgenommen wurde. Wer wirklich nur Vorschaubilder / Thumbnails braucht, von den ist diese Lösung ideal. Wer jedoch hochauflösende Bilder nutzen will, für den Muss eine andere Lösung her.
Bildaufnahme mit der Android Kamera

Verarbeiten eines Hochauflösenden Bildes

Ein Weg hochauflösende Bilder der Android-Kamera weiterzuverarbeiten, ist diese auf der SD-Karte des Gerätes zwischen zu speichern. Hierfür wird eine neue CameraActivity angelegt. Wird diese aufgerufen, so ist diese für das Speichern des Bildes zuständig:

public class CameraActivity extends Activity {

private static final String LOG_TAG = CameraActivity.class.getSimpleName();

private boolean done = true;
File sdDir;

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 + "FolderName" + File.separator);
root.mkdirs();
sdDir = new File(root, "image.jpg");
Log.d(LOG_TAG, "Creating image storage file: " + sdDir.getPath());
startCameraActivity();
} catch (Exception e) {
finish();
}

}

protected void startCameraActivity() {
Uri outputFileUri = Uri.fromFile(sdDir);
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) {
Intent intent = new Intent();
intent.putExtra("uri", sdDir.getPath());
setResult(Constatnts.ANSWER_TO_LIFE_UNIVERSE_AND_EVERYTHING, intent);
finish();
}

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

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


}

In der onCreate-Methode wird zunächst eine leere Datei image.jpg auf der SD-Karte abgelegt. Sie dient als Platzhalter für das spätere Bild. startCameraActivity() startet die Android-Kamera und übergibt im Intent die Information des Pfades zu unserem Bild. Mit den dazugehörigen Parametern wird die Android-Kamera dazu angewiesen die Datei auf genau diesem Dateipfad abzulegen. Sobald man per onActivityResult in diese Aktivität nach dem Schnappschuss zurückgekehrt ist wird ebenso hier ein Ergbnis der Aktivität gesetzt und der Intent mit der Uri versehen. Hinter Constatnts.ANSWER_TO_LIFE_UNIVERSE_AND_EVERYTHING versteckt sich einfach nur wieder ein willkürlicher Parameter - hier wieder die Zahl 42.
Schließlich kann die Aktivität. welch CameraActivity aufgerufen hat, das Bild empfangen, welches außerdem auf der SD-Karte gespeichert ist.

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
if (requestCode == Constatnts.ANSWER_TO_LIFE_UNIVERSE_AND_EVERYTHING) {
Log.d(LOG_TAG, "activity result; parsing uri: " + data.getStringExtra("uri"));
snapshot = BitmapFactory.decodeFile(data.getStringExtra("uri"));
}
}



4 Kommentare

  • Lukas

    Finde ich echt toll wie gut die Anleitung ist hast mir echt sehr geholfen. Ich würde mir noch mehr von deinen Anleitung wünschen.
    Gruß aus Mittelfranken.

    gepostet von Lukas
  • Hans Meier

    very nice! Thanks

    gepostet von Hans Meier
  • Sidenstein

    Muss auch sagen, top dokumentiert - Danke schön!

    gepostet von Sidenstein
  • Diana

    Super, vielen Dank für die Mühe und grüße aus Freiburg

    gepostet von Diana

Schreibe einen Kommentar

Make sure you enter the (*) required information where indicated. Basic HTML code is allowed.


Bitte vervollständigen Sie das Bild:

© 2010 softwaresupply | Liebknechtstraße 85, 63303 Dreieich | App Entwickler Blog | App Entwicklung | Homepage Design | Kontakt | Impressum | Geschäftsführung: Florian Lindner

Top Desktop version