1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. schrankhank, 24.02.2012 #1
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    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

    Ja, wenn du Fragen hast, frag einfach. :)
     
  3. schrankhank, 24.02.2012 #3
    schrankhank

    schrankhank Threadstarter Neuer Benutzer

    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

    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

    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

    Zufällig sowas fertiges hat keiner da?
     
    swordi gefällt das.
  7. franzgans, 08.06.2012 #7
    franzgans

    franzgans Neuer Benutzer

    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

    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

    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

    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

    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

    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

Die Seite wird geladen...

Users found this page by searching for:

  1. ftp bildergalerie app

    ,
  2. app bild upload ftp

    ,
  3. android speicher kamera ftp

Du betrachtest das Thema "Bild per FTP" im Forum "Android App Entwicklung",