Android : OutOfMemoryError beim Hochladen Video - wie man am besten Stück ?

? AP257 @ | Original: StackOverFlow
---

Ich habe das gleiche Problem http://stackoverflow.com/questions/1686446/upload-videos-in-android, aber ich werde ein paar mehr Details zu liefern. Bei dem Versuch, ein Video im Android hochladen, lese ich es in den Speicher, und wenn das Video groß ist ich eine OutOfMemoryError .

Hier ist mein Code :

// get bytestream to upload
videoByteArray = getBytesFromFile(cR, fileUriString);

public static byte[] getBytesFromFile(ContentResolver cR, String fileUriString) throws IOException {
    Uri tempuri = Uri.parse(fileUriString);
    InputStream is = cR.openInputStream(tempuri);
    byte[] b3 = readBytes(is);
    is.close();
    return b3;
}
public static byte[] readBytes(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    // this is storage overwritten on each iteration with bytes
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }
    return byteBuffer.toByteArray();
}

Und hier ist die Traceback ( der Fehler in der Zeile byteBuffer.write(buffer, 0, len) geworfen ) :

04-08 11:56:20.456: ERROR/dalvikvm-heap(6088): Out of memory on a 16775184-byte allocation.
04-08 11:56:20.456: INFO/dalvikvm(6088): "IntentService[UploadService]" prio=5 tid=17 RUNNABLE
04-08 11:56:20.456: INFO/dalvikvm(6088):   | group="main" sCount=0 dsCount=0 s=N obj=0x449a3cf0 self=0x38d410
04-08 11:56:20.456: INFO/dalvikvm(6088):   | sysTid=6119 nice=0 sched=0/0 cgrp=default handle=4010416
04-08 11:56:20.456: INFO/dalvikvm(6088):   at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~93)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at com.android.election2010.UploadService.readBytes(UploadService.java:199)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at com.android.election2010.UploadService.getBytesFromFile(UploadService.java:182)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at com.android.election2010.UploadService.doUploadinBackground(UploadService.java:118)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at com.android.election2010.UploadService.onHandleIntent(UploadService.java:85)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:30)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at android.os.Handler.dispatchMessage(Handler.java:99)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at android.os.Looper.loop(Looper.java:123)
04-08 11:56:20.456: INFO/dalvikvm(6088):   at android.os.HandlerThread.run(HandlerThread.java:60)
04-08 11:56:20.467: WARN/dalvikvm(6088): threadid=17: thread exiting with uncaught exception (group=0x4001b180)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088): Uncaught handler: thread IntentService[UploadService] exiting due to uncaught exception
04-08 11:56:20.467: ERROR/AndroidRuntime(6088): java.lang.OutOfMemoryError
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at com.android.election2010.UploadService.readBytes(UploadService.java:199)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at com.android.election2010.UploadService.getBytesFromFile(UploadService.java:182)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at com.android.election2010.UploadService.doUploadinBackground(UploadService.java:118)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at com.android.election2010.UploadService.onHandleIntent(UploadService.java:85)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:30)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at android.os.Looper.loop(Looper.java:123)
04-08 11:56:20.467: ERROR/AndroidRuntime(6088):     at android.os.HandlerThread.run(HandlerThread.java:60)
04-08 11:56:20.496: INFO/Process(4657): Sending signal. PID: 6088 SIG: 3

Ich denke, das http://stackoverflow.com/questions/1686446/upload-videos-in-android, muss ich es in Stücke hochladen. Aber ( Newbie-Frage Alarm ) bedeutet das, dass ich mehrere PostMethod Anträge zu stellen, und kleben Sie die Datei zusammen auf der Serverseite ? Oder kann ich den Bytestream in den Speicher geladen in Stücke, und kleben Sie sie zusammen in der Android -Code?

Wenn mir jemand einen Hinweis, der beste Ansatz geben könnte, wäre ich sehr dankbar.

---

Top 5 Antwort

1Jim Blackler @

Sie brauchen nicht die gesamte Datei in den Speicher schreiben möchten, dann laden Sie sie auf einen Schlag . Rufen connection.getOutputStream () und write () die Bytes in Stücke schneiden.

2Fedor @

Jim Blackler ist absolut richtig . Sie können komplette Video im Speicher in Byte nicht []. So sollten Sie lesen, Datei nicht auf [], sondern direkt an HttpUrlConnectio.getOutputStream Byte ().

Aber auch nach, dass Sie immer noch OutOfMemory weil HttpURLConnection speichert alle Ausgangsdaten in den Speicher und sendet sie zu vernetzen, nur wenn Sie komplette schriftlich sind .

Um dieses Verhalten zu überschreiben, die Sie verwenden können HttpUrlConnection.setChunkedStreamingMode () oder HttpUrlConnection.setFixedLengthStreamingMode (). Wenn Ihr Server Gutstoffstroms Brocken können setChunkedStreamingMode () verwenden. Ansonsten müssen Sie setFixedLengthStreamingMode verwenden . Um setFixedLengthStreamingMode benutzen müssen Sie genaue Inhalt Länge vor dem Start Streaming-Daten wissen, also ist es ein wenig kompliziert .

Nicht mehr OutOfMemory an dieser Stelle.

Wenn Sie Ihr Video in der Datei haben, können Sie einen anderen Ansatz, viel einfacher zu wählen. Verwenden Sie Httpclient und FileBody so http://stackoverflow.com/questions/3038409/how-to-send-http-post-request-and-recieve-response/3038747#3038747 . Ich denke, sie umzusetzen alle oben genannten Methoden, und Sie werden keine Sorgen zu machen .

3Anthony @

Nur ein kleiner Hinweis:

Die setChunkedStreamingMode und setFixedeLengthStreamingMode NICHT in Android 2.1 arbeiten, Sie funktionieren perfekt in 2,0 und 2,2

4Rags @

Es ist besser, die Datei in Teile aufgeteilt und hochladen. Führen Sie die Teile in der Server-Seite .