바코드 스캐너를 Zxing 라이브러리를 이용해서 구현했습니다.
그리고 바코드 스캐너 액티비티에 플래시온오프 버튼달아서 플래시기능을 추가했습니다.
그런데 플래시를 켜면 바로 앱이 죽는데요
public void requestAutoFocus(Handler handler, int message) {
if (camera != null && previewing) {
autoFocusCallback.setHandler(handler, message);
// Log.d(TAG, "Requesting auto-focus callback");
camera.autoFocus(autoFocusCallback); // <<<<<<< 여기서 죽습니다.
}
}
********* Error Log ******************************************
java.lang.RuntimeException: autoFocus failed
at android.hardware.Camera.native_autoFocus(Native Method)
at android.hardware.Camera.autoFocus(Camera.java:1297)
at com.google.zxing.client.android.camera.CameraManager.requestAutoFocus(CameraManager.java:222)
at com.google.zxing.client.android.CaptureActivityHandler.handleMessage(CaptureActivityHandler.java:75)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6646)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
그래서 아래처럼 플래시가 ON되었을때 코드를 막아보았습니다.
public void requestAutoFocus(Handler handler, int message) {
if (isFlashOn) return; // <<<<<<< 이렇게 막았습니다.
if (camera != null && previewing) {
autoFocusCallback.setHandler(handler, message);
//Log.d(TAG, "Requesting auto-focus callback");
camera.autoFocus(autoFocusCallback);
}
}
그러자 크래쉬는 나지 않으나 카메라 프리뷰가 프리징이 되었습니다.
즉, 플래시를 켜면 카메라 미리보기 화면이 플래시를 누른 시점에서 멈춥니다. 앱이 멈춘것은 아닙니다.
로그캣에는 다음과 같은메시지가 나옵니다.
I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread.
E/Camera: Error 2
플래시 온오프 코드는 아래와 같이 구현하였습니다.
private void setFlash(boolean turnOn) {
Camera camera;
if (turnOn) {
camera = CameraManager.get().getCamera().open();
Camera.Parameters p = camera.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
camera.startPreview();
} else {
camera = CameraManager.get().getCamera().open();
Camera.Parameters p = camera.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
camera.stopPreview();
}
}
뭐가 문제일까요 도와주세요...ㅠㅠ