我正在使用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。
有没有人面临同样或类似的问题?我怎样才能克服这个问题?它是特定于硬件还是错误?
答案 0 :(得分:0)
虽然这并不能解释您的应用挂起,但您应该考虑使用连续对焦,即Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE或FOCUS_MODE_CONTINUOUS_VIDEO。
请务必先使用getSupportedFocusModes()检查硬件是否支持它。
这将为您提供顺畅和持续的对焦体验。
答案 1 :(得分:0)
这就是我正在做的事情,它适用于所有设备
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;
}
};