我什么都试过了,但还是不能解决这个问题。
我在一个应用程序中实现了一个相机功能,除了自动对焦之外,一切都很好。当我调用autoFocus()时,它抛出一个异常,我不明白为什么。我在Desire HD上运行代码。
代码:
@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();
}
}堆栈跟踪:
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)发布于 2012-06-12 21:22:11
使用SurfaceHolder.Callback -> surfaceCreated了解何时可以启动AutoFocus。如果未创建(持续一段时间)表面持有者,则自动对焦将失败。
发布于 2012-02-03 19:21:07
您可能需要确保手机支持自动对焦。检查这一点非常容易:
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!
}发布于 2014-06-17 18:02:35
我提出了两个对我有效的解决方案。1)正确停止并恢复摄像头。我通过在onPause和onResume上调用这些方法来做到这一点,也是在相机预览的中间,我在应用程序中扫描二维码:
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来设置它,例如:
CameraPreview my_camera;查找"public void surfaceChanged“方法并进行以下更改:
//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!还有很多其他的修复,但这两个可能会挽救你的一天。
https://stackoverflow.com/questions/8820702
复制相似问题