Dialog -> Kamera aufrufen und Rückgabe verarbeiten?

T

Tom299

Stammgast
122
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:
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 ...
 
dann ruf es doch von der activity auf

der dialog wird ja von einer activity gestartet - also hast du eine activity
 
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.
 
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.
 
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 ...
 
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?
 
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);
				}
			}
		});
 
und woher kommt der handler ?

warum machst nicht einfach
AblesungActivity.this.startActivityForResult ?
 
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?
 
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
 
siehste mal, bei mir lernst sogar du noch was :flapper:
 
jap man lernt nie aus :D
 
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.
 
ich sag mal du machst was falsch, aber wenns funktioniert, dann ist doch schonmal gut.

viele wege führen nach rom
 

Ähnliche Themen

Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.107
Helmut1A
Helmut1A
W
  • waltsoft
Antworten
4
Aufrufe
918
waltsoft
W
M
  • maksimilian
Antworten
15
Aufrufe
1.634
maksimilian
M
Zurück
Oben Unten