我正在使用Android上的Camera API,并让我的代码可以在包括Samsung Galaxies和HTC Desire在内的多个平台上运行。到目前为止,我只是在HTC Desire Z上遇到问题,这是间歇性的。
在我的代码中我正在调用以下说明
camera.startPreview();
camera.autoFocus(autoFocusCallback);
我已经创建了所需的autoFocusCallback类。我想再次强调一下,这段代码适用于手机,包括我遇到问题的手机,所以不要仔细检查代码。 :)调用回调后,我的代码继续拍照,但那部分现在无关紧要。
间歇性问题是对于某个随机图片(在20-100次中发生一次),回调不会发生。我已经使用我自己的Log.i()验证了这是执行的最后一个命令(即代码没有进入回调)。调试还显示没有报告错误。
为了让您放心,我的回调看起来像这样
AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
Log.i("tag","this ran");
...
...
}
};
成功运行的Logcat结果看起来像这样
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): startPreview X
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus E
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus X
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): runAutoFocus E
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): af start (fd 49)
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): native_set_afmode: ctrlCmd.status == 0
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): af done: 1
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): runAutoFocus X
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): takePicture(479)
但有问题的运行就像这样
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): startPreview X
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus E
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus X
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): runAutoFocus E
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): af start (fd 49)
然后它就会挂起。
我想知道是否有人对此问题有任何想法,或者您是否经历过类似的事情? 我只是设法在网上找到一个类似问题的线程,这里是http://groups.google.com/group/android-developers/browse_thread/thread/75ecb8db0ae02bdb
答案 0 :(得分:6)
自动对焦通话没有超时。我遇到过一些设备,其中自动对焦调用偶尔无法回调(即使在完美的条件下)。相同的代码在其他设备上运行得很好。
我的解决方案是推出自己的自动对焦超时机制。我是按计划的未来完成的,但最佳的超时实现可能取决于您的具体用例。
final ScheduledFuture<?> focusTimeoutFuture = mScheduledExecutorService.schedule(new Runnable() {
@Override
public void run()
{
takePictureAndCancelAutoFocus();
}
}, 3, TimeUnit.SECONDS);// add a 3 second timeout to autofocus
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera)
{
// cancel the timeout future if it didn't run already
boolean canceledFuture = focusTimeoutFuture.cancel(false);
if(canceledFuture)
{
takePictureAndCancelAutoFocus();
}
}
}
答案 1 :(得分:3)
不是您特定问题的解决方案,但一般的问题是您可以在startpreview之前调用自动对焦。在这种情况下,打开预览时也不会发生自动对焦。
“此方法仅在预览有效时(startPreview()
之间和stopPreview()
之前)有效。”