相机自动对焦回调未发生。

12

我正在使用Android上的Camera API,并使我的代码在多个平台上运行,包括三星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

2个回答

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
我没有完全使用你的解决方案,但它确实有所帮助。例如,LG Spirit在成功对焦后停止对焦。 - Vojtěch

3
并非解决您特定问题的方法,但一般情况下,您可以在startpreview之前调用autofocus。 在这种情况下,当预览被打开时也不会发生自动对焦。
文档中可知:
“此方法仅在预览处于活动状态(在startPreview()stopPreview()之间)时有效。”

优秀的回答!谢谢!! - superUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接