Merge "Fix 2655246 file descriptor leak when accessing thumbnails http://b/2655246"

This commit is contained in:
Marco Nelissen
2010-06-23 12:42:30 -07:00
committed by Android (Google) Code Review

View File

@@ -317,22 +317,23 @@ public final class MediaStore {
// Log.v(TAG, "getThumbnail: origId="+origId+", kind="+kind+", isVideo="+isVideo);
// If the magic is non-zero, we simply return thumbnail if it does exist.
// querying MediaProvider and simply return thumbnail.
MiniThumbFile thumbFile = MiniThumbFile.instance(baseUri);
long magic = thumbFile.getMagic(origId);
if (magic != 0) {
if (kind == MICRO_KIND) {
byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
if (thumbFile.getMiniThumbFromFile(origId, data) != null) {
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap == null) {
Log.w(TAG, "couldn't decode byte array.");
MiniThumbFile thumbFile = new MiniThumbFile(isVideo ? Video.Media.EXTERNAL_CONTENT_URI
: Images.Media.EXTERNAL_CONTENT_URI);
Cursor c = null;
try {
long magic = thumbFile.getMagic(origId);
if (magic != 0) {
if (kind == MICRO_KIND) {
byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
if (thumbFile.getMiniThumbFromFile(origId, data) != null) {
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap == null) {
Log.w(TAG, "couldn't decode byte array.");
}
}
}
return bitmap;
} else if (kind == MINI_KIND) {
String column = isVideo ? "video_id=" : "image_id=";
Cursor c = null;
try {
return bitmap;
} else if (kind == MINI_KIND) {
String column = isVideo ? "video_id=" : "image_id=";
c = cr.query(baseUri, PROJECTION, column + origId, null, null);
if (c != null && c.moveToFirst()) {
bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
@@ -340,17 +341,13 @@ public final class MediaStore {
return bitmap;
}
}
} finally {
if (c != null) c.close();
}
}
}
Cursor c = null;
try {
Uri blockingUri = baseUri.buildUpon().appendQueryParameter("blocking", "1")
.appendQueryParameter("orig_id", String.valueOf(origId))
.appendQueryParameter("group_id", String.valueOf(groupId)).build();
if (c != null) c.close();
c = cr.query(blockingUri, PROJECTION, null, null, null);
// This happens when original image/video doesn't exist.
if (c == null) return null;
@@ -397,6 +394,9 @@ public final class MediaStore {
Log.w(TAG, ex);
} finally {
if (c != null) c.close();
// To avoid file descriptor leak in application process.
thumbFile.deactivate();
thumbFile = null;
}
return bitmap;
}