Datei Upload FTP

franzgans

Grünschnabel
Hallo zusammen.
Ich muss für die Schule eine Android-App schreiben mit der es möglich ist Bilder zu machen und diese werden danach automatisch an einen FTP-Server übertragen. Das soll nicht schön aussehen, das muss nur funktionieren. Egal wie. Ich hänge nun schon Tage lang an meinem Problem und finde keine Lösung. Ich habe nur noch knapp eine Woche Zeit dafür und allmählich läuft mir die Zeit davon.

Das Prinzip mit dem Bild machen und an einen FTP-Server ist im Prinzip nix großes eigentlich. Für mich leider als absolten Anfänger schon:(


Nun zu dem was ich schon habe:

Ich habe schon eine Kamera Actitvity und ein KameraCallbacks und eine FTP-Manager Acitivity.

Mit meiner FTPActivity kann ich mittlerweile nun endlich mal bei Aufruf der Activity ein Txt-Dokument auf meinen FTP-Server schicken.

Meine KameraActivity habe ich soweit umgeändert, dass ich nun Bilder in einem von mir ausgewählten ordner speichere. Dieser ist "/sdcard/FTP/"


Frage 1:

Wie sage ich nun meiner FTPActivity, dass es genau die Bilder in dem Ordner
"/sdcard/FTP/" übertragen soll? Wie und wo muss ich den Code entsprechend umändern?



Frage 2:

Ich habe ja die KameraActivity. Wie sage ich dieser, dass diese nach dem speichern des Bildes automatisch die FTPActivity aufruft?

Ich glaube irgendwie mit Intents. Aber wie? Ich habe schon etliche Male probiert das irgendwo einzufügen. Aber es klappt einfach nicht. Wie und wo muss ich den Code entsprechend auch hier umändern?

Hier mal die KameraActivity:

Code:
package de.android.datenuebertragung;

import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;

public class Kamera extends Activity implements SurfaceHolder.Callback {

	private static final String TAG = Kamera.class.getSimpleName();

	private Camera camera = null;
	private SurfaceHolder holder = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Benutzeroberfläche anzeigen
		setContentView(R.layout.cam);
		final SurfaceView view = (SurfaceView) findViewById(R.id.view);
		holder = view.getHolder();
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		// wir brauchen dieses Objekt für die Aufnahme
		final KameraCallbacks callbacks = new KameraCallbacks();
		// auf Anklicken reagieren
		view.setOnClickListener(new OnClickListener() {
		   public void onClick(View v) {
		      camera.takePicture(callbacks, null, callbacks);
		      
		    		
		   }
		});
	}

	@Override
	protected void onPause() {
		super.onPause();
		// ganz wichtig: Callback entfernen und Kamera freigeben
		if (camera != null) {
			holder.removeCallback(this);
			camera.release();
			camera = null;
		}
	}
	Intent intent = new Intent (this, FTPManager.class);
	@Override
	protected void onResume() {
		super.onResume();
		// prüfen, ob Kamera vorhanden ist
		camera = Camera.open();
		if (camera != null) {
			Camera.Parameters p = camera.getParameters();
			List<Camera.Size> list = p.getSupportedPreviewSizes();
			Camera.Size size = list.get(list.size() - 1);
			p.setPreviewSize(size.width, size.height);
			camera.setParameters(p);
			holder.addCallback(this);
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		camera.stopPreview();
	}

	public void surfaceCreated(SurfaceHolder holder) {
		try {
			camera.setPreviewDisplay(holder);
			camera.startPreview();
		} catch (IOException e) {
			Log.e(TAG, "surfaceCreated()", e);
		}
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}
	
}


und die KameraCallbackActivity:
Code:
package de.android.datenuebertragung;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Environment;
import android.util.Log;

public class KameraCallbacks implements ShutterCallback, PictureCallback {

	private static final String TAG = KameraCallbacks.class.getSimpleName();
	

	public void onShutter() {
		Log.d(TAG, "onShutter()");
	}

	public void onPictureTaken(byte[] data, Camera camera) {
		Log.d(TAG, "onPictureTaken()");
		// In welchem Verzeichnis soll die Datei abgelegt werden?
		File dir = Environment
				
				.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
		// ggf. Verzeichnisse anlegen
		dir.mkdirs();
		// Name der Datei 		// File wird in einem extra Ordner gespeichert
		File file = new File(String.format("/sdcard/DCIM/PicFTP/%d.jpg",
	            System.currentTimeMillis())); 

		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
		// Datei gepuffert schreiben
		try {
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(data);
		} catch (IOException e) {
			Log.e(TAG, "onPictureTaken()", e);
			
		} finally {
			// Ströme schließen - etwaige Exceptions ignorieren
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
				}
			}
			
			
			// Live-Vorschau neu starten
			camera.startPreview();
		
		}
		
		}

	}

und schließlich die FTP-Activity:

Code:
package de.android.datenuebertragung;

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;

import android.app.Activity;
import android.util.Log;

public class FTPManager extends Activity{
	FTPClient con = new FTPClient();{
		
		
	try
	{
	    con.connect("host");
	    if (con.login("user", "password"))
	    {
	    
	    	
	    	
	        con.enterLocalPassiveMode(); // important!
	        String data = "Test vom 09.06.12";
	        ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
	        boolean result = con.storeFile("/FTPTest.txt", in);
	        in.close();
	        if (result) Log.v("upload result", "succeeded");
	        System.out.println("Test ok ..."); 
	        
	    }
	}
	catch (Exception e)
	{
	    e.printStackTrace();
	}


	try
	{
	    con.logout();
	    con.disconnect();
	}
	catch (IOException e)
	{
	    e.printStackTrace();
	}
	}}
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schau mal hier für ein Umfangreiches beispiel zu Commons FTPClient:
http://www.torsten-horn.de/techdocs/java-ftp.htm

Zu Frage 1:
con.storeFile("/dein/ziel/verzeichnis/auf/dem/remote/server/deineDatei.txt",...)

Zu Frage 2:
Ja Activities kann man über Intents wechseln.
In deinem Fall könntest du dabei dem Intent zum Starten deiner FTP Activity noch den Pfad / Namen zu dem aufgenommenen Bild mitgeben, z.Bsp.: via intent.putExtra(key,value);

Hier ein kleines Beispiel dazu:
http://stackoverflow.com/questions/3747448/android-passing-data-between-service-and-activity

http://www.warriorpoint.com/blog/2009/05/24/android-how-to-switch-between-activities/
auch hier:
http://stackoverflow.com/questions/...-android-application-to-show-another-activity

Gruß Tom
 

franzgans

Grünschnabel
Hey, danke für deine Antwort. Füge ich aber nun die Zeile
Code:
con.storeFile("/dein/ziel/verzeichnis/auf/dem/remote/server/deineDatei.txt",...)
ein, dann erstellt der mir wieder auch nur eine txt-Datei. Ich möchte aber gerne alle Dateien die in einem Ordner auf meinem Android Gerät auf den FTP-Server übertragen. Am besten natürlich nur die, die noch nicht vorhanden sind.

Geht das irgendwie?

Muss ich das nicht mit InputStream machen? Ich komme da irgendwie nicht weiter.

Ich habe das Intent hinbekommen. Also so, dass er mir die nächste Klasse aufruft. Aber ich bekomme es nicht an die richtige Position eingefügt. So, dass es nach dem machen eines Bildes die FTPActivity aufruft. Aber erst mal ist es mir wichtig, dass er alle Bilder in dem speziellen Ordner auf meinen FTP-Server überträgt.

Dann noch eine Frage. Ist es möglich das soeben gemachte Bild direkt automatisch in einem kleineren Format (evtl. 640x480) gespeichert wird?