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

Dialog -> Kamera aufrufen und Rückgabe verarbeiten?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 26.04.2012.

  1. Tom299, 26.04.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hallo,

    ich habe das Problem, daß ich von einem Dialog und nicht von einer Activity die Kamera-Funktion aufrufen möchte.
    Mein Dialog hat den Context der aufrufenden Activity. Allerdings kann ich über den Context die Kamera nur ohne Result-Intent aufrufen:
    Code:
    ErfassungDialog.this.context.startActivity(intent);
    Das hat zur Folge, daß ich das Bild nicht zurückbekomme und nicht verarbeiten / speichern kann.

    Gibt es noch eine andere Möglichkeit, die Kamera-Funktion mit Rückgabewert aufzurufen? Oder muß ich den Dialog streichen und eine Activity daraus erstellen (was nicht gerade toll wäre ...)?

    Oder kann man dem Intent über putExtras() vorher schon sagen, unter welchem Pfad und welchem Dateinamen das Bild gespeichert werden soll? Das wär natürlich auch noch eine Alternative, dann könnte ich im Dialog dort nachlesen.


    Gruß,
    Tom
     
    Zuletzt bearbeitet: 26.04.2012
  2. BFK, 26.04.2012 #2
    BFK

    BFK Erfahrener Benutzer

    Beiträge:
    160
    Erhaltene Danke:
    10
    Registriert seit:
    08.12.2010
  3. Tom299, 26.04.2012 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich habe kein onActivityResult, weil ich nicht von einer Activity aufrufe ... deswegen suche ich einen anderen Weg. Aber das mit dem Uri als EXTRA_OUTPUT -> intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(fileImage)) werde ich mal testen. Vielleicht reicht mir das ja.

    Im Dialog kann ich onWindowFocusChanged überschreiben und bekomme dann mit, ob der Dialog wieder im Vordergrund ist (also Cam beendet) und kann dann nach der Bild-Datei suchen. Mal sehen ob das so klappt ...
     
  4. swordi, 26.04.2012 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    dann ruf es doch von der activity auf

    der dialog wird ja von einer activity gestartet - also hast du eine activity
     
  5. Tom299, 26.04.2012 #5
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    nein, das geht nicht, der dialog zum erfassen ist im vordergrund und muß auch offen bleiben, es werden im dialog selbst direkt checks durchgeführt, ob die eingabe stimmt. bei abweichung muß ein bild gemacht werden, ansonsten darf man den dialog nicht verlassen oder man muß die eingabe zurücksetzen.
     
  6. swordi, 26.04.2012 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    lol

    ich sag dir das geht :D

    auch wenn dein dialog im vordergrund offen ist - deine activity ist deshalb nich tod.

    zeig mal etwas code her.
     
  7. Tom299, 26.04.2012 #7
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    mal grob zur info:
    in meiner activity registriere ich einen handler, den ich einem eigenen array adapter übergebe. dort wird die onTouch überschrieben und der dialog erstellt und angezeigt. im dialog finden nun die plausi-checks statt. unter anderem muß ein bild gemacht werden.

    meine activity:
    Code:
    		handlerDialogerfassung = new Handler(new Callback() {
    			@Override
    			public boolean handleMessage(Message msg) {
    				if (msg != null) {
    					if (msg.arg1 == HANDLER_ACTION_DOPPELERFASSUNG) {						
    						selectedZaehlwerk = listZaehlwerk.get(msg.arg2);
    
    						// Dialog Doppelerfassung
    						doppelerfassungDialog = new DoppelerfassungDialog(AblesungActivity.this, selectedZaehlwerk, adapterZaehlwerk);
    						if (doppelerfassungDialog != null) {
    					    	if (selectedZaehlwerk != null) {		    		
    					    		String sDoppelerfassungInfo = "Bezeichnung: " + selectedZaehlwerk.toString();
    					    		if (selectedZaehlwerk.getEinheit() != null && selectedZaehlwerk.getEinheit().length() > 0) {
    					    			sDoppelerfassungInfo = sDoppelerfassungInfo + "\nEinheit: " + selectedZaehlwerk.getEinheit();
    					    		}
    					    		if (selectedZaehlwerk.getVk() != null && selectedZaehlwerk.getNk() != null) {
    					    			sDoppelerfassungInfo = sDoppelerfassungInfo + "\nVK.NK: " + selectedZaehlwerk.getVk().toString()
    					    									+ "." + selectedZaehlwerk.getNk().toString();
    					    		}
    					    		if (selectedZaehlwerk.getStandLetzter() != null) {
    					    			sDoppelerfassungInfo = sDoppelerfassungInfo + "\nLetzter Stand: " + selectedZaehlwerk.getStandLetzter().toString();
    					    		}
    					    		doppelerfassungDialog.setInfoText(sDoppelerfassungInfo);
    					    	}
    					    	doppelerfassungDialog.show();	
    						}
    						
    						return true;						
    					}
    					// TODO
    					else if (msg.arg1 == HANDLER_ACTION_EINFACHERFASSUNG) {
    						selectedZaehlwerk = listZaehlwerk.get(msg.arg2);
    						
    						// Dialog Einfacherfassung
    						einfacherfassungDialog = new EinfacherfassungDialog(AblesungActivity.this, selectedZaehlwerk, adapterZaehlwerk, auftragsnummer);
    						if (einfacherfassungDialog != null) {
    					    	if (selectedZaehlwerk != null) {		    		
    					    		String sEinfacherfassungInfo = "Bezeichnung: " + selectedZaehlwerk.toString();
    					    		if (selectedZaehlwerk.getEinheit() != null && selectedZaehlwerk.getEinheit().length() > 0) {
    					    			sEinfacherfassungInfo = sEinfacherfassungInfo + "\nEinheit: " + selectedZaehlwerk.getEinheit();
    					    		}
    					    		if (selectedZaehlwerk.getVk() != null && selectedZaehlwerk.getNk() != null) {
    					    			sEinfacherfassungInfo = sEinfacherfassungInfo + "\nVK.NK: " + selectedZaehlwerk.getVk().toString()
    					    									+ "." + selectedZaehlwerk.getNk().toString();
    					    		}
    					    		if (selectedZaehlwerk.getStandLetzter() != null) {
    					    			sEinfacherfassungInfo = sEinfacherfassungInfo + "\nLetzter Stand: " + selectedZaehlwerk.getStandLetzter().toString();
    					    		}
    					    		einfacherfassungDialog.setInfoText(sEinfacherfassungInfo);
    					    	}
    					    	einfacherfassungDialog.show();							
    						}
    					}
    				}
    				return false;
    			}
    		});
    		adapterZaehlwerk.setHandler(handlerDialogerfassung);
    

    aaaah, geht das auch mit nem handler? wenn ich im dialog einen handler nutze, auf den die activity reagiert, könnte ich ja von der activity aus das Kamera-Intent starten und auf die antwort reagieren. der dialog sollte ja dann im vordergrund bleiben ...
     
  8. swordi, 26.04.2012 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du kannst auch einfach im dialog die kamera starten - der dialog bleibt dann auch offen.

    ich check das problem nicht - gib einfach die activity deinem dialog und gut ist

    wie und wo startest du jetzt die kamera?
     
  9. Tom299, 26.04.2012 #9
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    die Kamera wird im dialog über einen der buttons gestartet:
    Code:
    		btnNeutral = (Button)findViewById(R.id.einfacherfassung_dialog_buttonNeutral);
    		btnNeutral.setText("Abbrechen");
    		btnNeutral.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				File fileImage = getNextAblesungFile();
    				if (fileImage != null) {
    					Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    					intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(fileImage));
    					EinfacherfassungDialog.this.context.startActivity(intent);
    				}				
    			}
    		});
    
    aber ich habs jetzt mal über den handler gemacht, das scheint zu funktionieren:
    Code:
    		btnNeutral = (Button)findViewById(R.id.einfacherfassung_dialog_buttonNeutral);
    		btnNeutral.setText("Abbrechen");
    		btnNeutral.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {				
    				if (handler != null) {
    					Message msg = Message.obtain();
    					msg.arg1 = AblesungActivity.HANDLER_ACTION_IMAGE;
    					handler.sendMessage(msg);
    				}
    			}
    		});
    
     
  10. swordi, 26.04.2012 #10
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    und woher kommt der handler ?

    warum machst nicht einfach
    AblesungActivity.this.startActivityForResult ?
     
  11. Tom299, 27.04.2012 #11
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Das geht natürlich nur, wenn ich die Activity an den Dialog übergebe:
    Code:
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    ablesungActivity.startActivityForResult(intent, AblesungActivity.INTENT_CAPTURE_IMAGE);
    
    Hab beides getestet, funktioniert auch beides. Aber welche Lösung würde man vorziehen? Die Activity dem Dialog übergeben, um direkt Zugriff zu erhalten, oder doch lieber mit nem Handler arbeiten?
     
  12. swordi, 27.04.2012 #12
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    also das mit dem handler hab ich in 3 jahren noch nie so gesehen. von daher wirds wohl auch nicht die beste variante sein :D
     
  13. Tom299, 27.04.2012 #13
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    siehste mal, bei mir lernst sogar du noch was :flapper:
     
  14. swordi, 27.04.2012 #14
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    jap man lernt nie aus :D
     
  15. Tom299, 27.04.2012 #15
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    so, ich hab mich jetzt doch für die version mit dem handler entschieden, weil ich von mehreren activities aus den dialog aufrufe.

    es ist einfacher, wenn jede activity ihren handler mitgibt und dann vom dialog bedient wird, als wenn ich im dialog auf alle activities casten muß, bevor ich sie verwenden kann.
     
  16. swordi, 27.04.2012 #16
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ich sag mal du machst was falsch, aber wenns funktioniert, dann ist doch schonmal gut.

    viele wege führen nach rom
     

Diese Seite empfehlen