1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Bild per FTP

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von schrankhank, 24.02.2012.

  1. schrankhank, 24.02.2012 #1
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    1
    Registriert seit:
    24.02.2012
    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.
     
  2. Unicate, 24.02.2012 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ja, wenn du Fragen hast, frag einfach. :)
     
  3. schrankhank, 24.02.2012 #3
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    1
    Registriert seit:
    24.02.2012
    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:)
     
  4. miha, 24.02.2012 #4
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    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
     
  5. Unicate, 24.02.2012 #5
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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 von einem Moderator bearbeitet: 17.06.2015
  6. schrankhank, 26.02.2012 #6
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    1
    Registriert seit:
    24.02.2012
    Zufällig sowas fertiges hat keiner da?
     
    swordi bedankt sich.
  7. franzgans, 08.06.2012 #7
    franzgans

    franzgans Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    08.06.2012
    Phone:
    HTC Incredible S
    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
     
  8. Tom299, 08.06.2012 #8
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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.
     
  9. schrankhank, 08.06.2012 #9
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    1
    Registriert seit:
    24.02.2012
    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!
     
  10. Tom299, 08.06.2012 #10
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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 ...");
          }
       }
    }
    
     
  11. franzgans, 08.06.2012 #11
    franzgans

    franzgans Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    08.06.2012
    Phone:
    HTC Incredible S
    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?
     
  12. franzgans, 08.06.2012 #12
    franzgans

    franzgans Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    08.06.2012
    Phone:
    HTC Incredible S
    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?
     
  13. appel11, 01.07.2012 #13
    appel11

    appel11 Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    5
    Registriert seit:
    09.03.2011
    Tablet:
    Archos Internet Tablet
    Hallo, habe es bei meinem app mit folgendem link gelöst wenig code und funkt relativ einfach. AndFTP Intents (FTP upload, download, share)
     

Diese Seite empfehlen