Android Geschossenes Foto in anderem Ordner speichern

SuchANewbie

Mitglied
Hallo,

ich bin ein ziemlicher Neuling und möchte mir eine App erstellen, mit der ich auf die kamera zugreifen kann, diese Bilder sollen in einem anderen Ordner gespeichert werden, das ich automatisch erstelle falls noch nicht vorhanden.
Die app hat im Startscreen drei Buttons:
Bild aufnehmen -> öffnet meine kamera
Gallerie -> soll meine Bilder dann anzeigen die in dem Ordner gespeichert sind.
Beenden -> selbsterklärend

Was ich bisher habe:
Überprüfung ob Ordner vorhanden, wenn nicht, wird neuer erstellt.
Öffnen der Kamera beim klick auf den Button.

Meine Frage / Mein Problem:
Wie schaffe ich es die geschossenen Bilder in dem Ordner abzuspeichern?

Mein Code:
Java:
package explido.galerie.app;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;

public class MainActivity extends Activity {

    private Button open_camera_button;
    private Button open_gallery_button;
    private Button end_app_button;

    /**
     * onCreate() is called as the first method of the program.
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        java.io.File file = new java.io.File("/gallerie_app/");
        if (file.exists()) {
            boolean myPath = true;
        } else {
            String galleryFolder = "/gallerie_app";
            String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            File myNewFolder = new File(extStorageDirectory + galleryFolder);
            myNewFolder.mkdir();
        }

        open_camera_button = (Button) findViewById(R.id.new_pic_button);
        open_camera_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                startActivityForResult(intent, 0);
            }
        });

        open_gallery_button = (Button) findViewById(R.id.gallery_button);
        open_gallery_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
        end_app_button = (Button) findViewById(R.id.end_app_button);
        end_app_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
                System.exit(0);
            }
        });
    }


}

Wäre über Hilfe sehr erfreut, während ich versuche der ganzen Java-Geschichte auf die Spuren zu kommen :)

Gruß
SuchANewbie!
 

dzim

Top Contributor
Neuling, was? Sorry, aber das sieht man...

Auweia! [c]System.exit(0);[/c] :-( Don't do that!!!
Die App beendet man über den Tasker oder über den Back-Button - in der Regel kümmert sich Android darum, also heisst es für dich nun: Nimm das wieder weg! Erfinde das Rad nicht neu - und erst Recht nicht mit solchen selbst im "normalen" Java unbeliebten Mitteln. Ok?

Und eigentlich ist die Verwendung von Unterstrichen in Java (und damit auch Android) gegen die Code-Konvention. Das verwendet man für statische Variablen in deiner Schreibweise oder aber für Enums oder "final statics" in Grossbuchstaben.

Aber zum Problem: Du kannst deinem Intent ein "Extra" mitgeben, in dem du den Pfad für das Bild festlegst.
Java:
	private void dispatchTakePictureIntent(int requestCode) {
		Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		imageFile = new File("a/path/to/the/file.png");
		takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
		// der RequestCode ist ein Callback, um nach Beenden der Kamera z.B. das Bild in einen
		// ImageView oder so zu laden...
		startActivityForResult(takePictureIntent, 1234);
	}

	// mit dieser Methode erfährst du, wenn dein Bild gespeichert wurde
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == REQUEST_CODE_IMG) {
			if (imageFile != null && imageFile.length() > 0) {
				handleCameraPhoto(Util.getBitmapFromFile(imageFile), true);
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	// man kann das Bild z.B. in einem Dialog anzeigen
	// (da der Code intern ist, ist das nur ein Show-Case und du müsstest es selbst anpassen)
	private void handleCameraPhoto(final Bitmap image, final boolean save) {
		LayoutInflater inflater = LayoutInflater.from(getActivity());
		final View addView = inflater.inflate(R.layout.photo_dialog, null);
		
		ImageView imageView = (ImageView) addView.findViewById(R.id.image);
		imageView.setImageBitmap(image);
		
		AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(), R.style.liDialog).setTitle(this.getString(R.string.photo_title)).setView(
				addView);
		
		alert.setNeutralButton(save ? this.getString(R.string.photo_ok) : this.getString(R.string.photo_cancel), new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
				if (save) {
					EventHandler.getInstance().fireEvent(Util.getByteArray(image), BuildingEditListener.IMAGE_ADDED);
					takePictureButton.setBackgroundResource(R.drawable.button_green_selector);
					takePictureButton.invalidate();
				}
				dialog.cancel();
			}
		});
		
		if (!UserHelper.isReadOnly(getActivity()) && !currentBuilding.isBuildingControlled()) {
			alert.setNegativeButton(this.getString(R.string.photo_new), new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int whichButton) {
					dispatchTakePictureIntent(REQUEST_CODE_IMG);
				}
			});
		}
		
		alert.show();
	}

Man kann dann natürlich noch jede Menge Quatsch mit dem Bild machen, um es zum Beispiel in der Grösse zu manipulieren, etc.
 

dzim

Top Contributor
Btw. Der Code von mir ist auch aus meinen Android-Anfängertagen... Ich habe ihn hier im git, würde aber heute so einiges anders machen als damals...
 

SuchANewbie

Mitglied
Hallo dzim,

ja bin ein echter Neuling auf diesem Gebiet, Java erst seit wenigen Monaten und auch nur am Rande und habe nun mit mit diesem Android Projekt begonnen. :rtfm::rtfm:

Ich danke Dir für Deine Hilfe und werde mal schauen wie ich weiterkomme! Bis dahin aber nochmal Danke :rtfm:

Gruß
Newbie
 

SuchANewbie

Mitglied
Update:
Fotografieren + Speichern (auch mehrerer Bilder) möglich nun möglich

Next Step:
Öffnen dieser "Galerie" über die App -> also Anzeigen der über die App geschossene Bilder in einer Galerie ansicht.
Für Denkanstöße bin ich gern offen, werde es erstmal selbst versuchen

Melde mich wieder
Gruß
Newbie
 

dzim

Top Contributor
Du müsstest wahrscheinlich einen Watcher auf das Verzeichnis ansetzen - am besten indem du einen (Array/*)Adapter erweiterst. Oder einen SimpleCursorAdapter und du liest entweder die Bildaten als Blob aus einer DB (willst du aber bestimmt nicht, wenn sie auf der SDCard sein sollen) oder halt den Pfad zum Bild. Die SimpleCursorAdapter - wenn sie richtig angewendet werden - updaten den Inhalt der View, an die sie angehängt sind (meistens Listen) automatisch. Da du aber sicher nicht nur eine Zeilenweise Ausrichtung der Daten möchtest, musst du mal schauen, welche passenden Layouts sich da für dich anbieten.

Eine erste Suche zeigte mir das hier:
Grid View | Android Developers
mit Referenz darauf hier:
Layouts | Android Developers

Ich denke du wirst fündig.

Und wie gesagt: Viele Beispiele verwenden ArrayAdapter, dann musst du aber dafür sorgen dass er a) beim ersten Initialisieren die vorhandenen Bilder ausliest und b) beim Speichern neuer Bilder aktualisiert wird.
Good luck.
 

SuchANewbie

Mitglied
Okay, schonmal danke für Deine Hilfe :)

Was mich aber brennend interessiert, wie funktioniert denn die Android Bildergalerie? Gibt es keine Möglichkeit diese sich zu nutze zu machen sozusagen?
Ist der Code möglicherweise zugänglich?:bahnhof:

Gruß
 

dzim

Top Contributor
Sollte OpenSource sein. Musst du halt mal bei Google Code schauen. Da wird es gehostet. Es gibt (wenn du im JavaDoc ein bisschen schaust) schon ein Gallery Widget, aber das ist deprecated - also wenn du ein GridLayout mit Adapter oder ein ähnliches Layout verwendest...
 

SuchANewbie

Mitglied
Ich bin echt am Hängen... :(

Kann ich denn nicht einfach meinen ausgewählten Ordner beim öffnen der Galerie durchzählen lassen und diese dann automatisch als Vorschaubilder anzeigen lassen, die sich durch klick vergrößern lassen?

Google möchte mir einfach nichts interessantes ausspucken... Kann man jemand mit einem Ansatz helfen? Bin hier am verzweifeln!
 

dzim

Top Contributor
Es gibt nichts, was so was out of the box macht - da musst du schon selbst Hand anlegen.

Wie gesagt: Bau dir einen Adapter (nimm erst mal nur den ArrayAdapter), der beim initialisieren den Ordner ausliest und intern eine Liste (LinkedList, damit die Ordnung erhalten bleibt? Sortieren erst einmal nach Datum.) bereit hält. Die kannst du dann später per überschriebener #add() -Methode erweitern und evtl. musst du dann noch #notifyDataSetChanged() (optional nach dem add, kannst du aber auch in der Methode selbst machen).
In deinem Layout - nimm hier erst einmal eine Liste, das ist am besten dokumentiert (z.B. hier: Using lists in Android (ListView) - Tutorial) - musst du dann nur auf die events hören, dann kannst du das Bild in einer separaten Activity oder einem anderen Fragment (je nachdem, wie du bisher deine Anwendung aufgebaut hast) anzeigen.

Eigentlich ist der Ablauf recht simpel, du musst dich einfach nur mit Adaptern beschäftigen und wo du sie anhängst. Der Rest ist Fleissarbeit.
 

Neue Themen


Oben