【发布时间】:2014-10-31 11:03:04
【问题描述】:
我正在使用 Android ImageReader 类从 MediaProjection.createVirtualDisplay 方法接收位图。
到目前为止,我的代码如下所示:
mProjection.createVirtualDisplay("test", width, height, density, flags, mImageReader.getSurface(), new VirtualDisplayCallback(), mHandler);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = mImageReader.acquireLatestImage();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
final byte[] data = new byte[buffer.capacity()];
buffer.get(data);
final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bitmap==null)
Log.e(TAG, "bitmap is null");
} catch (Exception e) {
if (image!=null)
image.close();
}
}
}, mHandler);
问题是 BitmapFactory 无法将 data[] 解码回 Bitmap,即 BitmapFactory 总是返回 null。我从 logcat 看到的唯一消息来自 android_media_ImageReader.cpp 并且是这样的:
D/ImageReader_JNI(1432): ImageReader_imageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.
W/ImageReader_JNI(1432): Image_getJpegSize: No JPEG header detected, defaulting to size=width=3891200
acquireLatestImage 返回的图像对象不为空,但也不是有效的 JPEG,我尝试检查以下失败的测试:
if((buf [0] & 0xFF) == 0xFF && (buf[1] & 0xFF) == 0xD8 && (buf[2] & 0xFF) == 0xFF && (buf[3] & 0xFF) == 0xE0)
Log.e(TAG, "is JPG");
else
Log.e(TAG, "not a valid JPG");
目前我唯一怀疑的是我正在测试的 Android 5.0 模拟器无法处理 API 调用。
有什么想法吗?
【问题讨论】:
-
下面有几个很好的答案可以解决您的问题。请选择一个作为接受的答案,以便其他人受益。
标签: android bitmap android-5.0-lollipop