android – 相机自动对焦回调未发生

我在 Android上使用Camera API,并将我的代码运行在包括三星galaxy和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

解决方法

自动对焦通话没有超时.我遇到一些自动对焦电话偶尔无法回调的设备(即使在完美的条件下).其他相同的代码在其他设备上运行正常.

我的解决方案是滚动自己的自动对焦超时机制.我按照预定的未来做了,但是最佳的超时执行可能取决于你的具体用例.

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();
            }
        }
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...