Change to stream decoding mode if the file descriptor cannot support seek.

bug: 3298498
Change-Id: Id7ae46bf8e885a417753edbd6648332052fee469
This commit is contained in:
Owen Lin
2011-01-18 17:39:15 +08:00
parent 92cd4d0296
commit a9d0d47076
2 changed files with 26 additions and 4 deletions

View File

@@ -556,11 +556,22 @@ public class BitmapFactory {
* @return the decoded bitmap, or null
*/
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
if (bm == null && opts != null && opts.inBitmap != null) {
throw new IllegalArgumentException("Problem decoding into existing bitmap");
if (nativeIsSeekable(fd)) {
Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
if (bm == null && opts != null && opts.inBitmap != null) {
throw new IllegalArgumentException("Problem decoding into existing bitmap");
}
return finishDecode(bm, outPadding, opts);
} else {
FileInputStream fis = new FileInputStream(fd);
try {
return decodeStream(fis, outPadding, opts);
} finally {
try {
fis.close();
} catch (Throwable t) {/* ignore */}
}
}
return finishDecode(bm, outPadding, opts);
}
/**
@@ -607,4 +618,5 @@ public class BitmapFactory {
private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,
int length, Options opts);
private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad);
private static native boolean nativeIsSeekable(FileDescriptor fd);
}