首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >autoFocus抛出异常

autoFocus抛出异常
EN

Stack Overflow用户
提问于 2012-01-11 22:11:51
回答 6查看 22.8K关注 0票数 21

我什么都试过了,但还是不能解决这个问题。

我在一个应用程序中实现了一个相机功能,除了自动对焦之外,一切都很好。当我调用autoFocus()时,它抛出一个异常,我不明白为什么。我在Desire HD上运行代码。

代码:

代码语言:javascript
复制
@Override
protected void onStart() {
     super.onStart();

     //grab seurface view and callback
     cameraView = (CameraSurfaceView) findViewById(R.id.cameraView);
     try{
        camera = Camera.open();
        cameraView.setCamera(camera);
        //release previous autofocus and assign new one
        camera.cancelAutoFocus();
        camera.autoFocus(new Camera.AutoFocusCallback() {

                public void onAutoFocus(boolean success, Camera camera) {
                // TODO Auto-generated method stub

                }});
    }
    catch (Exception e) {
        //had an issue accessing the camera prompt user
        //TODO create user prompt
        e.printStackTrace();
    }
}

堆栈跟踪:

代码语言:javascript
复制
01-11 16:09:38.456: W/System.err(26546): java.lang.RuntimeException: autoFocus failed
01-11 16:09:38.456: W/System.err(26546):    at android.hardware.Camera.native_autoFocus(Native Method)
01-11 16:09:38.456: W/System.err(26546):    at android.hardware.Camera.autoFocus(Camera.java:680)
01-11 16:09:38.456: W/System.err(26546):    at com.myapp.MyActivity.onStart(BarcodeScannerActivity.java:57)
01-11 16:09:38.466: W/System.err(26546):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1201)
01-11 16:09:38.466: W/System.err(26546):    at android.app.Activity.performStart(Activity.java:3955)
01-11 16:09:38.466: W/System.err(26546):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1845)
01-11 16:09:38.466: W/System.err(26546):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
01-11 16:09:38.466: W/System.err(26546):    at android.app.ActivityThread.access$1500(ActivityThread.java:135)
01-11 16:09:38.466: W/System.err(26546):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
01-11 16:09:38.466: W/System.err(26546):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 16:09:38.466: W/System.err(26546):    at android.os.Looper.loop(Looper.java:150)
01-11 16:09:38.476: W/System.err(26546):    at android.app.ActivityThread.main(ActivityThread.java:4385)
01-11 16:09:38.476: W/System.err(26546):    at java.lang.reflect.Method.invokeNative(Native Method)
01-11 16:09:38.476: W/System.err(26546):    at java.lang.reflect.Method.invoke(Method.java:507)
01-11 16:09:38.476: W/System.err(26546):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
01-11 16:09:38.476: W/System.err(26546):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
01-11 16:09:38.476: W/System.err(26546):    at dalvik.system.NativeStart.main(Native Method)
EN

回答 6

Stack Overflow用户

发布于 2012-06-12 21:22:11

使用SurfaceHolder.Callback -> surfaceCreated了解何时可以启动AutoFocus。如果未创建(持续一段时间)表面持有者,则自动对焦将失败。

票数 14
EN

Stack Overflow用户

发布于 2012-02-03 19:21:07

您可能需要确保手机支持自动对焦。检查这一点非常容易:

代码语言:javascript
复制
Camera.Parameters p = mCamera.getParameters();
List<String> focusModes = p.getSupportedFocusModes();

if(focusModes != null && focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
    //Phone supports autofocus!
}
else {
    //Phone does not support autofocus!
}
票数 7
EN

Stack Overflow用户

发布于 2014-06-17 18:02:35

我提出了两个对我有效的解决方案。1)正确停止并恢复摄像头。我通过在onPause和onResume上调用这些方法来做到这一点,也是在相机预览的中间,我在应用程序中扫描二维码:

代码语言:javascript
复制
public void stopCamera(){
     mCamera.cancelAutoFocus();
     mCamera.setPreviewCallback(null);
     mCamera.stopPreview();  
     mPreviewing = false;
     }

public void rethrottleCamera(){
        updateViews(); //Updates my Layouts
        mPreviewing = true;
        mCamera.startPreview();
        mCamera.setPreviewCallback(previewCb);  
        mCamera.autoFocus(autoFocusCB); 
        }   

2)非常棘手,但像魔术一样工作!确保在创建预览曲面后调用自动聚焦。为此,运行具有200ms延迟的自动聚焦,以便为创建曲面争取时间。通过在"CameraPreview“对象声明上按ctrl+clic来设置它,例如:

代码语言:javascript
复制
CameraPreview my_camera;

查找"public void surfaceChanged“方法并进行以下更改:

代码语言:javascript
复制
//Add a delay to AUTOFOCUS after mCamera.startpreview();!!:
    mCamera.startPreview();                 
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {                    
            mCamera.autoFocus(autoFocusCallback);
            }
    }, 200); //<-200 millisecond delay

    //If you call autofocus right after startPreview, chances are,
    //that the previewSurface will have not been created yet,
    //and autofocus will fail:
    mCamera.startPreview();               //Bad idea!
    mCamera.autoFocus(autoFocusCallback); //Bad idea!

还有很多其他的修复,但这两个可能会挽救你的一天。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8820702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档