Pfade und Umsetzung

  • Daher mein Thread leider in einem anderen Bereich tot gegangen ist aber ich doch noch eine Verständnisfrage hätte dachte ich daher es eher eine Anfängerfrage ist frage ich sie mal hier. Also ich möchte alle Bilder rekursiv aus dem "Lokalen Speicher >> Pictures >> Screenshots" die Bilder auf den Server laden. Wie ich ein Bild sende habe ich umgesetzt gekriegt aber nur so das der User immer das Bild einzelnd auswählen muss, dann senden muss und dann erst wieder das ganze von vorne. Ich würde einfach gerne als Beispiel 3 Möglichkeiten anbieten die man sichern kann wie zum Beispiel:

    • Screenshots
    • SharePic (Wird angelegt wenn nicht vorhanden)
    • Pictures >>Backup


    diese dann automatisch hochladen wenn eine WLAN Verbindung vorhanden ist. Wozu das ganze ? Ich will mich in Networking einarbeiten und denke so kleine Aufgaben sind ganz interessant. Ich vermute das ich mit File.I/O arbeite muss aber habe wie gesagt keine Ahnung wie ich die Internen Pfade anspreche dann.
    Es wäre echt Klasse wenn da mir jemand eine Antwort zu geben könnte. Ich hatte das in einen anderen Thread von mir mit rein getan aber klar ist es da nicht beachtet worden weil das Thema ein anderes war mit dem ich mich aber auch noch befasse.


    Also meine Fragen wären:

    • Wie sind die Pfade zu setzen als Beispiel wie oben genannt zu "Lokaler Speicher >> Pictures >> Screenshots" ?
    • Wie kriege ich es hin das er rekursiv alle Dateien innerhalb von dem Ordner hochläd und man nicht alle auswählen muss oder so ein Kram ?
    • Lieber ein Java Server der es empfängt und verarbeitet oder ein Html PHP gemisch komplett ausreichend mit der entsprechenden ssl Sicherung ?


      Liebe Grüße

  • Na gut, dann hier. ;)


    Ich denke, Du unterschätzt die kleine Aufgabe.


    1) Du arbeitest bei der Netzwerkkommunikation nicht mit Strings, sondern mit Binärdaten. (In Android waren das glaube ich Input– und Output Streams.) Sich da zu merken wo man bereits war ist mindestens schwierig, da TCP Kommunikation an sich relativ schwierig ist.
    Die Pakete werden synchron erstellt, synchron verschickt und auch synchron an die App weitergeleitet, aber während des Versands können Asynchronitäten auftreten, wenn beispielsweise Paket 8 die Pakete 5-7 überholt und Paket 3 aus ungeklärter Ursache mitten drin verloren geht und noch einmal gesendet werden muss. Zwar kümmert sich die Netzwerkschnittstelle selbst darum, dass in Deiner App nur die Sachen landen, die zusammenhängend sortiert wurden, Annahmen über den tatsächlich verschickten Inhalt sind aber mindestens zufällig.



    Die Pfade ziehst Du am Bequemsten über das System, da Du eher keine Ahnung haben dürftest, wie sie angelegt sind.

    Code
    // Holt Dir den Ordner für die Bilder
    File path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
    // Holt Dir den Unterordner 'Screenshots'
    File screenshotsDir = new File(path, "Screenshots");


    Näheres in der Dokumentation:
    https://developer.android.com/…irectory(java.lang.String)


    Rekursion ist dann halt so eine Sache.


    • Zunächst mal musst Du prüfen, ob Du wirklich in einem Ordner bist. (isDirectory())


    • Jetzt wäre es sinnvoll zu wissen, wie tief Du bereits in der Ordnerstruktur bist und ob Du aus Zeit– und Performancegründen nicht ab einer gewissen Tiefe abbrechen möchtest.


    • Dann musst Du jede einzelne Datei, die Du hochladen willst, auslesen. Wenn jemand so deppert war ein TXT oder PDF da rein zu legen musst Du das natürlich ignorieren. (listFiles(FileFilter))


    • Die Ordnerstruktur müsstest Du Dir intern dann auch noch vorhalten, damit Du nachher beim Upload alles so wiederherstellen kannst.


    • Tja, und für jede einzelne Datei fängst Du dann wieder bei 1 an.


    Damit kannst Du Dir halt eine Repräsentation des Verzeichnisbaums erstellen, welchen Du dann versuchst hochzuladen.
    Gucken welchen Ordner du hast, Webserver sagen er soll den anlegen, gucken welche Dateien Du darin hast, alle Dateien dieser Ebene hochladen, (1) gucken welche Unterordner Du hast, Webserver sagen er soll die anlegen, gucken welche Dateien Du darin hast, alle Dateien dieser Ebene hochladen, weiter bei 1…

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Danke für deine Antwort. Ich habe anscheinend ein Fehler in meiner Api oder ähnliches wo er sich erstmal auf dem Server registriert... Vielleicht kannst du mir erklären wo ich da den Fehler habe.Diese Fehlermeldung verstehe ich nicht so ganz weil ich da kein Fehler sehe



    wenn du da irgendwelche Code einsichten brauchst um mir den Fehler zu erklären sag mir bitte welche und ich zeige sie hier. Danke im vorraus an dich oder diese die mir helfen

  • android.os.NetworkOnMainThreadException sagt schon alles. ;)


    Dein Fehler ist, dass Du den Code auf Android >2 ausführst.
    Um dort Netzwerkaktivität hin zu bekommen, musst Du das in den Hintergrund auslagern.


    Idealerweise nimmst Du hierfür einen AsyncTask.
    Nähere Infos zu den Hintergründen findest Du im Guide zu Prozesse und Threads.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Danke für deine Antwort. Auf deine Antwort hin kam mit in den Kopf das bestimmt der StrictMode in diesem Fall meine Lösung sein könnte :) Nach ein wenig rumspielen mit einer If Methode und dem lesen der entsprechenden Doku


    Hier zu finden:
    StrictMode | Android Developer


    bin ich auf den Lösungsweg gekomen:

    Java
    if (android.os.Build.VERSION.SDK_INT > 9)
            {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }


    So funktioniert es nun und wenn ich die Doku richtig verstehe löse ich dadurch keine Sicherheitsprobleme innerhalb von meiner App aus ^^ Danke für deine Hilfe

  • Interessante Sichtweise. Nachdem ich Dir den Lösungsweg AsyncTask zeige kommt Dir die Idee, der Lösungsweg könnte der Strict Mode sein…


    Du löst damit keine Sicherheitsprobleme aus, umgehst aber ein Konstrukt, dass Deine App daran hindert bei diversen Problemen* die Nutzerinteraktion zu verweigern.


    Insofern: You're doin' it wrong!



    *) Server antwortet nicht, keine Netzverbindung, Download dauert ewig…

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ok dann werde ich mich doch mit ASync rum ärgern :) Hat ja irgendwie recht ^^


    Muss zurzeit eh ein wenig meine php api erstmal noch erweitern damit ich uuid und alls do dinge dann auch abfragen kann ^^ Ich setz mich mal ran und wenn ich wegen ASync einen Lösungsweg habe dann werde ich ihn hier natürlich auch schreiben ^^

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!