08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.hardware.Camera.setHasPreviewCallback(Native Method)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.hardware.Camera.access$600(Camera.java:58)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:331)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.os.Handler.dispatchMessage(Handler.java:99)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.os.Looper.loop(Looper.java:123)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at android.app.ActivityThread.main(ActivityThread.java:4364)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at java.lang.reflect.Method.invokeNative(Native Method)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at java.lang.reflect.Method.invoke(Method.java:521)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
08-26 14:48:06.944: ERROR/AndroidRuntime(8935): at dalvik.system.NativeStart.main(Native Method)
카메라 어플자체는 정상적으로 돌아가나, 카메라 어플 종료시에 이 로그가 발생하면서 어플이 끝난뒤에 예상치 않은 오류(익숙한)을 띄우면서 종료 해 버리더군요.
갤스로 작업하고 있습니다. 혹시 이러한 비슷한 증상을 겪으신분들 어떻게 해결하 셨는지 알려주시면 감사하겠습니다.^^
아래는 오류가 나고 있는 preview의 풀소스입니다.
package com.samsung.Camera;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
Preview(Context context) {
super(context);
// SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
// 알 수 있습니다.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
// Preview 를 표시할 위치를 설정합니다.
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
Preview.this.invalidate();
}
});
} catch (IOException exception) {
// mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
mCamera.startPreview();
// mCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// 다른 화면으로 돌아가면, Surface가 소멸됩니다. 따라서 카메라의 Preview도
// 중지해야 합니다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
// 경우 -액티비티가 일시정지 상태가 된 경우 등 - 자원을 반환해야합니다.
mCamera.stopPreview();
mCamera.release();
// mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// 표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작합니다.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
// mCamera.setParameters(parameters);
mCamera.startPreview();
// mCamera.stopPreview();
// mCamera.startPreview();
}
public boolean capture(Camera.PictureCallback jpegHandler, Camera.ShutterCallback shutterHandler, Camera.PictureCallback rawHandler){
if(mCamera !=null){
mCamera.takePicture(shutterHandler, rawHandler, jpegHandler);
return true;
}
else{
return false;
}
}
}