42

我正在开发一个库,以使Camera开发人员更容易使用 API。

Droid Incredible 2 在纵向模式下使用后置摄像头无法拍照。具体来说,我在 LogCat 中得到了这个序列:

08-18 09:25:52.094: E/QualcommCameraHardware(1368): native_get_picture: MSM_CAM_IOCTL_GET_PICTURE fd 25 error Connection timed out
08-18 09:25:52.094: E/QualcommCameraHardware(1368): getPicture failed!
08-18 09:25:52.094: E/QualcommCameraHardware(1368): get picture failed, giving jpeg callback with NULL data

这些消息在我调用 5 秒后出现takePicture()Camera这与我看到的一些旧源代码相吻合,因为QualcommCameraHardware它设置了 5000 毫秒的超时时间ioctl()来与相机硬件通话。

最终结果是onPictureTaken()传递了一个null byte[]JPEG 数据,这意味着我们没有照片。

该设备在所有其他经过测试的配置中都可以与我的代码一起使用,包括使用前置摄像头在纵向模式下工作。

有谁知道可能导致此特定故障的特定内容?

更新

我无法再重现该错误。我会删除这个问题,但是一旦有了答案,这显然是不可能的。

4

2 回答 2

1

MSM_CAM_IOCTL_GET_PICTURE 是运行函数的内核调用

static int msm_get_pic(struct msm_sync *sync, void __user *arg)

我从 HTCdev 下载了您设备的内核源代码,并找到了定义的函数

drivers/media/video/msm/msm_camera-7x30.c

拍照时可以检查内核消息是什么吗?

adb shell su -c "dmesg"
于 2013-12-11T20:19:08.710 回答
0

很可能cameraService是媒体进程的一部分在后台崩溃了。如果您只是尝试在 android 中运行默认的相机应用程序并且它没有显示,那么只需重新启动设备即可消除此错误。

我认为您正在为原始和 jpeg 回调重用图片回调。因此,如果它被称为原始回调,则数据可能为空。因为文件说,

触发异步图像捕获。随着图像捕获的进行,相机服务将向应用程序发起一系列回调。拍摄图像后发生快门回调。这可用于触发声音,让用户知道图像已被捕获。原始图像数据可用时发生原始回调(注意:如果没有可用的原始图像回调缓冲区或原始图像回调缓冲区不足以容纳原始图像,则数据将为空)。当缩放的、完全处理的 postview 图像可用时,会发生 postview 回调(注意:并非所有硬件都支持这一点)。jpeg 回调在压缩图像可用时发生。如果应用程序不需要特定的回调,则可以传递 null 而不是回调方法。

于 2013-11-05T10:09:43.550 回答