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

base64 datei mit webservice erhalten

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MandraKobold, 21.12.2011.

  1. MandraKobold, 21.12.2011 #1
    MandraKobold

    MandraKobold Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    59
    Erhaltene Danke:
    2
    Registriert seit:
    18.11.2011
    Hallo,

    ich steh mal wieder etwas auf dem Schlauch und zwar folgendes Problem:
    mit KSOAP2 erfolgt eine anfrage an einen Webservice, bei erfolg, wird mir eine
    base64 'datei' gesendet. Diese müsste ich nun speichern aber irgendwie komme ich an der stelle nicht weiter:

    Code:
    SoapObject response = (SoapObject) envelope.getResponse();
    
    Ich erhalte also ein base64 und müsste diese nun encoden und dann speichern. Zum encoden habe ich die base64 Klasse von hier
    iHarder.net Home Page gesichert. Ist diese notwendig ? Hat android eine eigene Klasse für diese Zwecke?

    Denke das es gut wäre dass als Stream zu sichern ?!?

    Freue mich über Eure Anregungen und Eure Meinungen zu dem Thema sowie, .. vielleicht ein paar codesnipes (?) :sleep:
    Danke


    LG
    Mandra
     
  2. v Ralle v, 22.12.2011 #2
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Also wenn ich mich richtig erinnere, hatte man bei Android kaum Möglichkeiten zum ent- und verschlüsseln. Beim Googlen bin ich dann damals auf eine Klasse gestoßen, die von vielen empfohlen wurde. Ich glaube der Link gehört dazu: How to base64 encode decode Android | Android Code Monkey

    Allerdings habe ich jetzt auch nochmal geschaut und unter android.util die gesehen: Base64 | Android Developers

    Ich habe aber - wie gesagt - nur mit der oberen gearbeitet.

    Noch ein Tipp am Rande: Wenn du schon base64 hast, müsstest du es de- und nicht encoden. Sonst ist dein Ergebnis doppelt encoded.
     
    MandraKobold bedankt sich.
  3. MandraKobold, 22.12.2011 #3
    MandraKobold

    MandraKobold Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    59
    Erhaltene Danke:
    2
    Registriert seit:
    18.11.2011
    Danke für die Antwort.
    Ja richtig habe mich mit dem en- und decoden etwas vertan.
    Besteht eine Begrenzung bezüglich der grösse die über Ksoap übermittelt werden kann oder die base64 decoden kann??
    Meine Datei die übermittelt wird kann bis zu 20MB haben, daher die Frage.

    Edit:
    Es sieht so aus als wenn es eine Begrenzung geben würde, allerdings weiss ich noch nicht ob es tatsächlich eine Begrenzung der oben gennaten entspricht oder
    ober der ram nicht ausreicht, die Daten zwischen zu speichern.
    Vielleicht mal ein stück code:

    Code:
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    
            try {
                // built a connection
                androidHttpTransport.call(SOAP_ACTION, envelope);
    
                // Get the SoapResult
                SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope
                        .getResponse();
    
                    // Do something with the download data
                    String result = resultsRequestSOAP.toString();
                    if (result != "") {
                        byte[] b= Base64.decode(result, Base64.DEFAULT);
    
                           ByteArrayInputStream test = new ByteArrayInputStream(b, 0,
                                b.length);
                        String rootpath = gd.getSDRootPath() + File.separator;
    
                        OutputStream fOut = new FileOutputStream(new File(
                                rootpath, gd.getProjectName() + ".zip"));
                        int byteCount = 0;
                        byte buffer[] = new byte[1024];
                        
                        int bytesRead = -1;
                        while ((bytesRead = test.read(buffer)) != -1) {
                        
                            byteCount += bytesRead;
                            fOut.write(buffer, 0, bytesRead);
                        
    
                        }
                        fOut.flush();
                        fOut.close();
                    }    
    
            } catch (Exception e) {
               // ToDo
            }
    
    
    Da ich weiss dass bestimmte Dateien, die von einem Server bezogen werden, grösser sind (bis 20MB) und nicht verarbeitet werden,
    aber kleinere Dateien ohne probleme mit der oben gennaten codeteil verarbeitet werden können, liegt die vermutung nahe dass es wohl
    mit der grösse der Datei zusammenhängt.
    Hat jemand bereits Erfahrung mit Ähnlichem und könnte mir einen Tip geben?
    Sollte ich vielleicht einen anderen Ansatz als KSOAP verfolgen oder die Datei gestückelt werden (was ungern passieren sollte)??

    DANKE
     
    Zuletzt bearbeitet: 22.12.2011
  4. v Ralle v, 22.12.2011 #4
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Ich wüsste nicht, warum es bei der Base64 Klasse eine Limitierung der Dateigröße geben sollte. Ich vermute sehr stark, dass es ein RAM Problem ist. Sieh dazu einfach mal in Logcat nach, das steht dort exakt drin.

    Weiterhin kann man das auch ganz leicht mit der normalen JVM überprüfen. Schreibe doch mal eine Testklasse und überprüfe die Base64 Klasse, ich könnte wetten, dass es dort funktioniert.

    Zu KSOAP kann ich nicht viel sagen.
     
  5. MandraKobold, 03.01.2012 #5
    MandraKobold

    MandraKobold Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    59
    Erhaltene Danke:
    2
    Registriert seit:
    18.11.2011
    Hallo,

    ich muss das Thema leider noch einmal aufgreifen.
    Bis zu einer bestimmten grösse von Daten, die vom WebService kommen funktioniert alles ohne Probleme. Allerdings treten ab einer grösse von mehr als 10 MB die Probleme auf.
    Im LogCat steht das der Heap ständig vergrössert wird, nur dass der nicht ausreicht so das die Methode ein Dauerläufer wird ohne Ergebnis (habe es eine halbe Stunde laufen lassen).
    Das Problem tritt an folgender stelle auf :

    Code:
    
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); //--------------------- ab hier 
         androidHttpTransport.call(SOAP_ACTION, envelope);
    //---------------------
    Kann es sein, dass die Methode nur eine bestimmte grösse an zurückerhaltenen Daten verarbeiten kann?
    Der RAM vom Handy ist 1GB, kann das bei der grösse wirklich ein Problem sein??
    Hat jemand ähnlich Erfahrungen mit diesen Methoden/Klassen und/oder kann mir eine alternative nennen?
    Würde mich sehr freuen. Danke

    LG
    Mandra
     
  6. v Ralle v, 03.01.2012 #6
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Damit habe ich noch nicht gearbeitet. Zum RAM kann ich aber sagen, dass 1GB nicht viel aussagt. Es kommt auf die Heap Größe an, die eine App nutzen darf. 10mb sollten aber im Rahmen sein. Allerdings können auch große Bilder nervende Probleme bereiten. Ist immer ein ziemliches Gefrickel (besonders wenn man hardwareschwache Geräte unterstützen muss).

    Ich hoffe, jemand kann dir noch besser helfen.
     
  7. MandraKobold, 04.01.2012 #7
    MandraKobold

    MandraKobold Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    59
    Erhaltene Danke:
    2
    Registriert seit:
    18.11.2011
    Danke.
    Es scheint wirklich die Heap grösse zu sein, die wohl bei manchen Geräten +/- 16 MB beträgt, das hängt aber auch mit der OS Version zusammen.
    Meinem Galaxy S2 scheint das nicht genug zu sein. Daher werde ich mich jetzt daran versuchen den InputStream direkt zu speichern und dann zu parsen.
    Gerade wie du schon sagst auch Hardware schwache Geräte unterstützt werden sollten.
    Werde mich wieder melden wenn ich ne Lösung habe oder hier jemand noch einen Tip hat.

    LG
     

Diese Seite empfehlen