アンドロイド: OutOfMemoryErrorがビデオをアップロード中に - どのように最善のチャンクに?

? AP257 @ | Original: StackOverFlow

私は同じ問題http://stackoverflow.com/questions/1686446/upload-videos-in-androidを持っていますが、私はいくつかの詳細を供給します。アンドロイドで動画をアップロードしようとしている間、私はメモリにそれを読んでいると、ビデオが大きい場合には、私はOutOfMemoryErrorが発生し得る。

ここに私のコードは次のとおりです。

// 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();
}

そして、ここでトレースバックが(エラーが「 ____ 」の行にスローされます)です:

byteBuffer.write(buffer, 0, len)

私は、私はチャンクでそれをアップロードする必要がhttp://stackoverflow.com/questions/1686446/upload-videos-in-androidを推測。しかし、 (初心者質問アラートが)それは私が複数のPostMethod要求を行い、サーバ側で一緒にファイルを接着べきであることを意味するのでしょうか?または私はチャンクでメモリにバイトストリームをロードし、 Androidのコードでそれを一緒に接着することができますか?

誰もが私に最善のアプローチについての手掛かりを与えることができれば、私は非常に感謝される。

Top 5 答え

1Jim Blackler @

その後、 1外出先でそれをアップロードし、メモリ内のファイル全体を取得する必要はありません。 connection.getOutputStream ()とチャンク内の書き込み( )バイトを呼び出します。

2Fedor @

ジムBlacklerは絶対に正しいです。あなたは[]バイトのメモリで完全なビデオを持つことはできません。あなたがファイルを読む必要がありますので、 []が、直接HttpUrlConnectio.getOutputStreamにバイトしないように( ) 。

HttpURLConnectionのは、メモリ内のすべての出力データをキャッシュし、あなたは完全な書き込みをしているときにのみネットワークに送信しますので、しかし、その後も、あなたはまだのOutOfMemory得るでしょう。

この動作を変更するにはHttpUrlConnection.setChunkedStreamingModeを使用することができます()またはHttpUrlConnection.setFixedLengthStreamingMode ( ) 。あなたのサーバーがストリームチャンクを受け入れる場合はsetChunkedStreamingModeを使用することができます( ) 。そうしないと、 setFixedLengthStreamingModeを使用する必要があります。 setFixedLengthStreamingModeを使用するには、ストリーミングデータを開始する前に正確なコンテンツ長を知る必要がありますので、それは少しトリッキーです。

この時点ではこれ以上のOutOfMemory 。

あなたがファイルにあなたのビデオを持っている場合は、別のアプローチ、ずっとシンプルを選択することができます。そのようにHttpClientをし、ファイルボディを使用してくださいhttp://stackoverflow.com/questions/3038409/how-to-send-http-post-request-and-recieve-response/3038747#3038747 。私は、彼らが上記のすべてのメソッドを実装して、あなたはそのことについて心配する必要はありませんと思います。

3Anthony @

ほんの少しの注意:

setChunkedStreamingModeとsetFixedeLengthStreamingMode彼らは2.0と2.2で完璧な仕事、アンドロイド2.1で動作しない

4Rags @

その優れた部品にファイルを分割し、アップロードします。サーバ側で部品をマージします。