1. Nimm jetzt an unserem AGM - Gewinnspiel teil - Informationen zum M1, A2 und A8 findest Du hier, hier und hier!
  1. Tom299, 26.04.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    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

  3. Tom299, 26.04.2012 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    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

    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

    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

    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

    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

    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

    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

    und woher kommt der handler ?

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

    Tom299 Threadstarter Android-Experte

    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

    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

    siehste mal, bei mir lernst sogar du noch was :flapper:
     
  14. swordi, 27.04.2012 #14
    swordi

    swordi Gewerbliches Mitglied

    jap man lernt nie aus :D
     
  15. Tom299, 27.04.2012 #15
    Tom299

    Tom299 Threadstarter Android-Experte

    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

    ich sag mal du machst was falsch, aber wenns funktioniert, dann ist doch schonmal gut.

    viele wege führen nach rom
     

Besucher kamen mit folgenden Begriffen auf unsere Seite:

  1. dialog kamera

    ,
  2. dialog kemara