2

良い一日の仲間の開発者。

私はAndroidがアプリから画像をアップロードするのに忙しいです。
私もそれを動作させました(コードは以下に続きます)。
しかし、大きな画像(10メガピクセル)を送信すると、メモリ不足の例外が発生してアプリがクラッシュします。
これに対する解決策は圧縮を使用することですが、フルサイズの画像を送信したい場合はどうなりますか?
おそらく小川のあるものだと思いますが、私は小川に慣れていません。おそらくurlconnectionが役立つかもしれませんが、私には本当にわかりません。

ファイル名にFile[0to9999].jpgという名前を付けます。画像の日付を含む投稿値はFiledataと呼ばれます。投稿値dropboxidのUIDを指定します。

以下のコードは機能しますが、高解像度の画像を送信できない問題を解決したいと思います。

敬具

try
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 100, bos);
    byte[] data = bos.toByteArray();

    HttpPost postRequest = new HttpPost(URL_SEND);

    ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg");
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("Filedata", bab);
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
    postRequest.setEntity(reqEntity);

    HttpResponse response = httpClient.execute(postRequest);
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    String sResponse;
    StringBuilder s = new StringBuilder();

    while((sResponse = reader.readLine()) != null)
    {
        s = s.append(sResponse);
    }

    if(d) Log.i(E, "Send response:\n" + s);
}
catch (Exception e)
{
    if(d) Log.e(E, "Error while sending: " + e.getMessage());
    return ERROR;
}
4

1 に答える 1

3

使用しByteArrayOutputStreamてから呼び出すと、JPEGが使用しているメモリの量#toByteArray()が実質的に2倍になります。ByteArrayOutputStreamエンコードされたJPEGで内部配列を保持し、呼び出すと、新しい#toByteArray()配列を割り当てて、内部バッファからデータをコピーします。

大きなビットマップを一時ファイルにエンコードし、とを使用FileOutputStreamFileInputStreamて画像をエンコードして送信することを検討してください。

「アップロード」なしで-あなたのアプリは、私が想定しているメモリ内の巨大なビットマップだけで「うまく」生き残りますか?

編集:FileBody

File img = new File(this is where you put the path of your image)
ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null);
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("Filedata", cb);
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
于 2012-04-27T12:45:47.983 に答える