Bild per FTP

S

schrankhank

Neues Mitglied
1
Hallo zusammen,

ich bin neu hier und wollte fragen ob mir jemand helfen kann. Ich möchte ein App entwickeln in dem ich ein Bild mit der Camera machen und es anschließend per FTP hochladen. Der FTP Server soll fest definiert sein.

Das App ist für eine Ehrenamtliche Organisation also wäre schön wenn uns jemand unterstützen könnte.
 
Ja, wenn du Fragen hast, frag einfach. :)
 
Gut also ich hab noch keine erfahrung mit Java nur mit anderen Programmiersprachen. Ich finde leider zu meinem Problem kein Tutorial oder ähnliches. Ich habe zwar jetzt hinbekommen mit der Camera ein LiveBild zu bekommen aber das wars. Also ich bräuchte wenn dann von Grundauf Hilfe:)
 
Gib ihnen meine App AutoShare ...

Einfachste Lösung ansonsten Bild per Intent anfordern, mit Ftpclient hochladen. Source dazu findet sich bei Stackoverflow. Google Stichworte Camera Intent und android ftpclient.

Gesendet von meinem SK17i mit der Android-Hilfe.de App
 
Nun gut.
Also ich würde hier anfangen (Java ist denke ich die kleinste Sorge):

Amazon.de: Android

In diesem Buch (ich geh mal ganz davon aus, das die alle ähnlich aufgebaut sind) wirst du früher oder später hierauf stoßen. Da sind alle Android-Internen Klassen in Abhängigkeit der jeweiligen API erklärt, je nach dem für welche Version(en) du deine App schreiben willst. Und du findest dort außerdem einige Beispielprogramme.

Wenn du schon weisst welche Entwicklungsumgebung (IDE) du verwenden möchtest, kann es los gehen ;) Ansonsten empfehle ich Eclipse.

Dann solltest du Wissen in welche Richtung das zu gehen hat. Und wenn du dann noch Fragen hast, meld dich nochmal.

Viel Erfolg!
 
Zuletzt bearbeitet von einem Moderator:
Zufällig sowas fertiges hat keiner da?
 
  • Danke
Reaktionen: swordi
Hallo zusammen. Ich bin auf der Suche nach meinem problem auf das selbe Problem gestoßen.
Ich muss für die Schule auch eine App schreiben mit der ich ein Bild mache und das automatisch auf einen FTP Server geschickt wird. Das muss keine extras haben. Nicht wirklich schön aussehen. Das muss einfach nur funktionieren. Ich habe schon sämtliche Foren durchsucht. Aber nie wirklich was vernünftiges gefunden. Bei Stackoverflow habe ich auch schon eine Frage gestellt. Aber so richtig helfen konnte man mir dort nicht.
Man hat mich nur auf folgeneden Link verwiesen: http://hoang17.com/posts/android/android-how-to-upload-a-file-via-ftp

Das habe ich dann auch soweit gemacht. Ich habe jetzt drei Activities. Eine Kamera Activity, eine Preview und eine FTPManager. Den Code für den FTP Manager habe ich von der obigen Seite. Dort habe ich auch die Library commons-net-3.1-bin in mein Eclipse mit eingebunden. Meine Kamera Activity sieht so aus:
Code:
import java.io.IOException;
import java.util.List;

import android.app.Activity;
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;
        }
    }

    @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 mein FTP Code so:
Code:
package de.android.datenuebertragung;

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

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

import android.util.Log;

public class FTPManager {
    FTPClient con = new FTPClient();{
    try
    {
        con.connect("host name");
        if (con.login("username", "password"))
        {
            con.enterLocalPassiveMode(); // important!
            String data = "test data";
            ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
            boolean result = con.storeFile("/test.txt", in);
            in.close();
            if (result) Log.v("upload result", "succeeded");
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }


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


Meine Frage ist nun, wie sage ich der Kamera activity, dass er das Bild nicht auf dem lokalen Speicher speichern soll, sondern es via FTP Übertragen soll?

Am besten irgendwie mit Beispiel. Ich habe schon sämtliche Foren durchforstet, aber komme auf keinen grünen Zweig.
Mein Projekt habe ich auf Dropbox hochgeladen. Ich hoffe mir kann da jemand helfen. Mir läuft nämlich langsam die Zeit davon:(
Hier das Projekt: http://dl.dropbox.com/u/7981485/PicFTP 08.06.12 Copy.rar
 
Also ich würde das Bild erst mal abspeichern. Denn was ist, wenn du gerade keine Connection hast und nichts auf den FTP übertragen kannst?

Speicher das Bild / die Bilder in einem Verzeichnis deiner Wahl ab. Dabei kannst du noch evtl. Umrechnungen durchführen, also z.B. nur 640*480 oder so was.

Danach startest du deinen FTP-Manager und der läd dann das Bild / die Bilder hoch. Nach erfolgreichem hochladen kannst du das Bild / die Bilder dann löschen.

Denke das ist die sauberste Lösung und es geht kein Bild verloren, falls du mal Connection-Probleme hast.
 
Das hört sich wirklich nach der besten Lösung an. Ich weiß nur nicht wie es geht. Ich komme nicht weiter. Werde wohl leider das Projekt sterben lassen müssen. Danke aber an alle!
 
Code:
public final static int INTENT_CAPTURE_IMAGE = 1;

public void startCameraIntent() {
   String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myAppDir/images";
   File fImage = new File(path + "/" + "bild1" + ".png");
   Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
   intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(fImage));
   startActivityForResult(intent, MyActivity.INTENT_CAPTURE_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == INTENT_CAPTURE_IMAGE) {
      if (resultCode == Activity.RESULT_OK) {
         System.out.println("Bild gespeichert ...");
      }
   }
}
 
Hallo, erstmal vielen Dank für die Antwort.
Wo füge ich denn den obigen Code ein? Sorry, aber ich bin echt ein Neuling auf dem Gebiet.

Ich habe den jetzt in den FTP Manager eingefügt.

Code:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;

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

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;

public class FTPManager extends Activity{
    FTPClient con = new FTPClient();{
    try
    {
        con.connect("host");
        if (con.login("name", "test1234"))
        {
            con.enterLocalPassiveMode(); // important!
            String data = "test data";
            ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
            boolean result = con.storeFile("/test.txt", in);
            in.close();
            if (result) Log.v("upload result", "succeeded");
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }


    try
    {
        con.logout();
        con.disconnect();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}
    public final static int INTENT_CAPTURE_IMAGE = 1;

    public void startCameraIntent() {
       String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myAppDir/images";
       File fImage = new File(path + "/" + "bild1" + ".png");
       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
       intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(fImage));
       startActivityForResult(intent, FTPManager.INTENT_CAPTURE_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == INTENT_CAPTURE_IMAGE) {
          if (resultCode == Activity.RESULT_OK) {
             System.out.println("Bild gespeichert ...");
          }
       }
    }
}

Ich bezweifel aber, dass das Richtig ist.

Meine KameraCallback sieht so aus:
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 file = new File(dir, Long.toString(System.currentTimeMillis())
                + ".jpg");
        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();
            
            
        }
    }

    
}


Ich würde jetzt einfach bei dir.mkdirs ein Verzeichnis in meinem Telefon errichten. Momentan speichert er mir das noch auf "DIRECTORY_PICTURES".
Kann ich auch irgendwie das Verzeichnis wo das gespeichert werden soll, selbst erstellen?

Und nach Abschluss des Speichervorgangs soll die FTPManager Activity gestartet werden. Diese würde ich jetzt mit einem Intent und der startActivity () aufrufen?! Oder? Und diese würde ich am Ende vor dem Aufruf:

// Live-Vorschau neu starten
camera.startPreview();

einfügen. Ist das richtig?
 
Update.

Also, Ich hab es jetzt soweit, dass er mir ein Bild in einem von mir ausgewählten Verzeichnis speichert.

Wie bekomme ich jetzt hin, dass er das soeben gemachte Bild per FTP überträgt? Also, die FTPManager Activity von selbst aufruft. Da hängt es momentan noch. Und wie bekomme ich in dem FTP Manager das Verzeichnis ausgewählt welches Übertragen werden soll?
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.051
jogimuc
J
D
  • DasDannychen
Antworten
7
Aufrufe
731
rene3006
R
dimoll
  • dimoll
Antworten
3
Aufrufe
1.300
chrs267
chrs267
Zurück
Oben Unten