2014-01-14 53 views
0

我测试上三星GT I8260,三星S4和索尼爱立信Xperia迷你st15i一个Android应用程序。camera.cancelAutoFocus将不会返回或抛出异常

在预览模式和不断自动对焦的情况下,某些时候应用程序(每次都会再次调用camera.autoFocus)调用camera.cancelAutoFocus(),然后设置一些关于手电筒的参数(以便启动或停止手电筒模式)并最终调出camera.autoFocus。

S4和Xperia都能正常工作。但gt在调用camera.cancelAutoFocus后停止响应,它既不返回也不抛出异常。它只是挂起。

为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但不适合的Xperia其抛出的setParameters异常。

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

回答

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支持()。

这会给你一个平稳和持续的焦点体验。

+0

我用FOCUS_MODE_CONTINUOUS_VIDEO做没有给出预期的结果。由于API版本限制,无法使用CONTINUOUS_PICTURE(9) – Blim

0

这是我正在做的和它的所有设备

  1. 如果需要
  2. 在surfaceDestroyed方法删除我在surfaceChanged开始自动对焦
  3. 启动闪光灯工作

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; 
    } 
}; 
+0

问题是,我想在相机预览时打开手电筒。据我所知,在某些设备(xperia mini)中,如果您尝试设置参数以使用手电筒,而相机自动对焦,则应用程序会崩溃。所以我尝试在自动对焦时随机取消自动对焦。在我的三星设备不调用cancelAutofocus设备不影响参数的设置... – Blim

+0

@Blim请检查现在我已经添加了闪光灯以及顺便说一句,用这段代码剪辑我也有自动对焦当我将相机移动到黑暗的物体开始预览时闪光灯。让我知道你仍然在这方面遇到麻烦。 – swiftBoy