camera.cancelAutoFocus不会返回或抛出异常

时间:2014-01-14 21:34:09

标签: android camera autofocus flashlight

我正在使用samsung gt i8260,samsung s4和sony ericsson xperia mini st15i测试Android应用程序。

在预览模式和自动对焦时代码的某些位置的应用程序(每次都回调调用camera.autoFocus)调用camera.cancelAutoFocus(),然后设置一些关于手电筒的参数(以启动或停止手电筒模式)并最终回忆起camera.autoFocus。

S4和Xperia都运行良好。但是在调用camera.cancelAutoFocus之后gt停止响应,它既不返回也不抛出异常。它只是挂起。

cancelAutoFocus的文档:

Cancels any auto-focus function in progress. Whether or not auto-focus is currently in progress, this function will return the focus position to the default. If the camera does not support auto-focus, this is a no-op.

并未解释此行为。

删除cancelAutoFocus适用于S4和GT,但不适用于在setParameters上抛出异常的Xperia。

有没有人面临同样或类似的问题?我怎样才能克服这个问题?它是特定于硬件还是错误?

2 个答案:

答案 0 :(得分:0)

虽然这并不能解释您的应用挂起,但您应该考虑使用连续对焦,即Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE或FOCUS_MODE_CONTINUOUS_VIDEO。

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#FOCUS_MODE_CONTINUOUS_PICTURE

请务必先使用getSupportedFocusModes()检查硬件是否支持它。

这将为您提供顺畅和持续的对焦体验。

答案 1 :(得分:0)

这就是我正在做的事情,它适用于所有设备

  1. 我在surfaceChanged
  2. 中启动自动对焦
  3. 如果需要,启动Flash Light
  4. 在surfaceDestroyed方法中删除

  5. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
    {
        if(mCamera==null)
            return;
    
        Camera.Parameters parameters = null;
        parameters = mCamera.getParameters();
        if (Holder.getSurface() == null)
        {    // preview surface does not exist
            //mCamera = null;
            return;
        }
    
        // Stopping the camera preview so as to set the new params
        try
        {
            mCamera.stopPreview();// why the application is crashing here
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    
        try
        {
            mCamera.setParameters(parameters);
            mCamera.startPreview();
    
            //Check Whether device supports AutoFlsh, If you YES then Enable AutoFlash
            if (parameters.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO))
            {
                parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
            }
    
            if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//FOCUS_MODE_CONTINUOUS_VIDEO
            }
            else if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO))
            {
                mCamera.autoFocus(myAutoFocusCallback);
                //parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            }
        }
        catch(Exception e1)
        {
            e1.printStackTrace();
        }   
    }
    
    
    public void surfaceDestroyed(SurfaceHolder holder) 
    {
        try
        {
            mCamera.cancelAutoFocus();
            mCamera.stopPreview();      
            mCamera.release();
            mCamera = null;
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    // --------------- AutoFocusCallback methods implementations ----------//
    AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback()
    {
       @Override
       public void onAutoFocus(boolean arg0, Camera arg1) 
       {                   
           isAutofoucsed =true;
       }
    };