1

私の Android アプリケーションでは、Assets/Drawable/raw フォルダーにある画像をサーバーにアップロードする必要があります。私は次のことを試しました:

InputStream fileInputStream;    
if(imageChanged)   {    
   File file = New File("filename");    
   fileInputStream = new FileInputStream(file);   
}else   {    
  fileInputStream = ctx.getAssets().open("default.png");    
}   
int bytesAvailable;    
byte[] buffer = new byte[102400];    
while((bytesAvailable = fileInputStream.available()) > 0) {    
    int bufferSize = Math.min(bytesAvailable, 102400);     
    if(bufferSize<102400){    
         buffer = new byte[bufferSize];    
    }
    int bytesRead = fileInputStream.read(buffer, 0,bufferSize);
    dos.write(buffer, 0, bytesRead);
}

これはうまく実行されます。入力ストリームを読み取って DataOutputStream にバイトを書き込むことができ、画像がサーバーにアップロードされます。

とにかく、サーバーの画像が破損しているように見えます-デフォルトの画像のみ(「else」ブロックにアップロードされます。「if」ブロックの画像は破損していません)

また、default.pngを「raw」フォルダーに配置して、以下を試しました

fileInputStream = ctx.getResources().openRawResource(R.drawable.default);

ここでも同じ結果 - サーバーのイメージが破損しています。

これが default.png がアプリケーション空間にあるためかどうか疑問に思い始めています。

アプリケーション スペース (drawable/asset/raw) に画像をアップロードする適切な方法を教えてもらえますか?

ありがとう!

ニミ

4

1 に答える 1

0

バッファサイズと関係があるのでしょうか?アセットフォルダーからpngを読み書きするために、2つの異なる方法を試しましたが、どちらも機能する画像を生成しました。FileOutputStreamを使用してSDカードに書き込みましたが、それは問題ではないはずです。

InputStream is, is2;
FileOutputStream out = null, out2 = null;
try {
  //method 1: compressing a Bitmap
  is = v.getContext().getAssets().open("yes.png");
  Bitmap bmp = BitmapFactory.decodeStream(is);
  String filename = Environment.getExternalStorageDirectory().toString()+File.separator+"yes.png";
  Log.d("BITMAP", filename);
  out = new FileOutputStream(filename);
  bmp.compress(Bitmap.CompressFormat.PNG, 90, out);

  //method 2: Plain stream IO
  String filename2 = Environment.getExternalStorageDirectory().toString()+File.separator+"yes2.png";
  out2 = new FileOutputStream(filename2);
  Log.d("BITMAP", filename2);
  int r, i=0;
  is2 = v.getContext().getAssets().open("yes.png");
  while ((r = is2.read()) != -1) {
    Log.d ("OUT - byte " + i, "Value: " + r);
    out2.write(r);
    i++;
  }

} catch (IOException e) {
  e.printStackTrace();
} finally {
  try {
    if (out != null)
      out.close();
    if (out2 != null)
      out2.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}
于 2011-04-28T04:34:25.853 に答える