実際にはビットマップであるinput-streamのコンテンツをfile-output-streamにコピーしたいと思います。その後、file-output-streamの内容をBitmapFactory.decodeStreamに渡します。その結果、画像が破損します。これらのもののための私のコードは以下の通りです。
private void copyInStreamToFile(InputStream is) {
byte buf[] = new byte[1024];
int len;
FileOutputStream fos;
try {
fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
while ((len = is.read(buf)) > 0)
fos.write(buf, 0, len);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static FileInputStream getStream() throws FileNotFoundException {
return context.openFileInput(FILENAME);
}
私はこれをダウンロードメソッド内で呼んでいます
ビットマップdownloadBitmap(String url){final int IO_BUFFER_SIZE = 4 * 1024;
// AndroidHttpClient is not allowed to be used from the main thread
final HttpClient client = AndroidHttpClient.newInstance("Android");
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w("ImageDownloader", "Error " + statusCode
+ " while retrieving bitmap from " + url);
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
inputStream = entity.getContent();
copyInStreamToFile(new FlushedInputStream(inputStream));
DeviceProperties device = new DeviceProperties(activity);
return decodeBitampFromResource(device.getDeviceHeight(),
device.getDeviceWidth());
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
デコードを行う最後の方法は次のとおりです。
public static Bitmap decodeBitampFromResource(int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
FileInputStream fis;
InputStream is;
Bitmap bitmap = null;
// kanonika tha vriskei to megethos tis photo alla kapoio problima
// iparxei me ton sixronismo
try {
fis = getStream();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(fis, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
fis.close();
fis = getStream();
bitmap = BitmapFactory.decodeStream(fis, null, options);
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
file-output-streamの内容をクリアする必要がありますか?私がAndroid開発者から知っているように、openFileOutputはファイルを開いてその内容を上書きするか、存在しない場合は作成します。