1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

CameraShot über Intent Problem

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von TheEvilOne, 20.03.2012.

  1. TheEvilOne, 20.03.2012 #1
    TheEvilOne

    TheEvilOne Threadstarter App-Anbieter (In-App)

    Beiträge:
    452
    Erhaltene Danke:
    50
    Registriert seit:
    19.05.2010
    Hallo,

    ich habe eine MalApp geschrieben. Sie ist soweit fertig, nur heute ist mir noch ein Bug aufgefallen. Und dieser Bug hindert mich als einzigstes noch vor der Veröffentlung im Market *argh*

    Und zwar kann man in der App die Kamera aufrufen und ein Foto machen. Das Foto wird dann der Zeichenfläche hinzugefügt und man kann es bemalen. Auf allen Smartphones funktioniert es einwandtfrei.

    Jetzt konnte ich die Funktion heute früh auf einem Samsung Galaxy Tab und einem Acer Iconia testen und bei beiden fliegt mir die Anwendung an der Stelle um die Ohren.

    In der Anwendung rufe ich über ein Intent die Kamera auf:

    Code:
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, true);
    startActivityForResult(intent, CAM_REQUESTCODE);
    
    Nachdem man ein Bild gemacht hat, kann man auf der Kamera "Fertig" oder "Speichern" klicken, dann wird folgender Code ausgeführt:

    Code:
    if(data != null){
    Uri selectedImage = data.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
    ...
    
    Wie gesagt, bei Smartphones funktioniert es super. Bei Tablets ist die Uri "selectedImage" null und ich bekomme eine NullPointerException.

    Ich möchte, dass die Kamera das Bild in ihrem vom System vorgegebenen Ordner ablegt. Von dem geschossenen Bild erstelle ich mir eine Kopie und zeige diese in der Zeichenfläche an, ohne sie zu diesem Zeitpunkt in das Dateisystem zu schreiben.

    Ich dachte erst, es könnte vielleicht daran liegen, dass die Camera meines Smartphones die Bilder auf der SD-Karte und das Tablets die Bilder in den internen Speicher ablegt. Aber dann würde ich doch eine andere Fehlermeldung bekommen.

    Kennt jemand das Problem oder kann mir irgendwie weiterhelfen?

    Danke und viele Grüße
     
  2. TheEvilOne, 20.03.2012 #2
    TheEvilOne

    TheEvilOne Threadstarter App-Anbieter (In-App)

    Beiträge:
    452
    Erhaltene Danke:
    50
    Registriert seit:
    19.05.2010
  3. TheEvilOne, 26.03.2012 #3
    TheEvilOne

    TheEvilOne Threadstarter App-Anbieter (In-App)

    Beiträge:
    452
    Erhaltene Danke:
    50
    Registriert seit:
    19.05.2010
    Ich muß mich jetzt hier mal über die Android-Kamera auslassen. Das ist ja nicht zum Aushalten :thumbdn:

    Ich steuere die Kamera über ein Intent an. Funktioniert auf den meisten Devices auch super, nur u.a. auf Samsung-Geräten nicht. Da ist das Result dann null, wenn ich data.getData() aufrufe.

    Aber okay, für diesen Fall habe ich mit dem oben verlinkten Beitrag einen Workaround gebastelt:

    Wenn das data.getData() null ist, hole ich mir die ID´s von den Kamera-Bildern desc sortiert und nehme da dann einfach das erste Objekt. Nun sollte man meinen, das man immer das zuletzt geschossene Bild bekommt ...denkste! Z.B. beim Motorola Xoom oder bei dem Acer Iconia Tab werden die geschossenen Bilder nicht im System gespeichert, wenn man die Kamera über einen Intent aufruft. Da zeigt er dann also ein falsches Bild an (er nimmt die letzte ID und da er das Bild nicht speichert, gehört die letzte ID also zu einem anderen Objekt).

    Wäre das noch nicht genug werden bei vielen Devices die Bilder oft (aber nicht immer) automatisch um 90° gedreht. Das versuche ich jetzt zu lösen, indem ich die Metadaten eines Bildes mittels exif auslese und das Bild dann dementsprechend zu drehen. Das steht aber noch an, habe ich mir also noch nicht angesehen.

    Dann dachte ich: Hey, sprichst Du die Camera eben direkt über die API an. Also habe ich ein CameraPreview gebastelt. Wenn ich hier die Kamera im Landscape-Modus darstelle, funktioniert das Speichern auch und auch die Rotation stimmt. Stelle ich allerdings die Preview in Fullscreen dar, werden die Bilder z.B. bei HTC-Geräten korrupt im Dateisystem gespeichert.

    Dann gibt es noch ein Problem mit der Kamera im Portrait-Modus.

    Ich bin jedenfalls noch an dem Problem dran ...mußte mir eben nur mal etwas Luft machen.
     
  4. Tom299, 26.03.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    ich hab unter anderem ein Samsung Galaxy S2 zum Testen, und ich bekomm mein Bild immer zurück über das getExtras():

    Code:
        	if (requestCode == INTENT_CAPTURE_IMAGE) {
        		if (resultCode == Activity.RESULT_OK) {
        			// get the picture
        			Bitmap bitmap = (Bitmap) data.getExtras().get("data");
        			if (bitmap != null) {
            			try {
    						FileOutputStream fos = new FileOutputStream(getNextFile());
    						bitmap.compress(CompressFormat.JPEG, 100, fos);
    	        			fos.close();
    	        			Toast.makeText(getApplicationContext(), "Bild gespeichert", Toast.LENGTH_SHORT).show();
    					} 
            			catch (FileNotFoundException e) {
    						e.printStackTrace();
    					}
            			catch (IOException io) {
            				io.printStackTrace();
            			}
        			}
        		}
        	}
    
    Ich rufe das Intent aber ohne MediaStore.EXTRA_OUTPUT auf.

    Ich hatte aber große Probleme mit der Rotation, da meine Activities alle im Portrait sind und wenn ich das Bild im Landscape speichere, dann hat die Anwendung beim zurückkommen verrückt gespielt. Habs aber nun in den Griff bekommen ...


    Gruß Tom
     

Diese Seite empfehlen