안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요
카메라 프리뷰를 띄우는 코드를 보고 작성을해서 실행을 해 보았는데
처음 어플을 실행하고 종료한후에 다시 어플을 실행하면 에러메시지가 뜹니다.
하지만 에러 메시지를 닫고 다시 어플을 실행하면 어플이 정상 동작하는 현상이 생깁니다.
(즉, 어플실행 -> 종료 -> 어플실행 -> 에러 -> 에러창 닫고 다시 어플실행 -> 정상동작 이 반복이 됩니다.)
어느부분이 문제가 있는지 잘 모르겠습니다.
1.6버전으로 테스트 했습니다.
(즉, 어플실행 -> 종료 -> 어플실행 -> 에러 -> 에러창 닫고 다시 어플실행 -> 정상동작 이 반복이 됩니다.)
어느부분이 문제가 있는지 잘 모르겠습니다.
1.6버전으로 테스트 했습니다.
code아래와 같습니다.
package android.demo;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
public class camera16 extends Activity {
private Preview mPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Hide the window title.
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// Create our Preview view and set it as the content of our activity.
mPreview = new Preview(this);
setContentView(mPreview);
}
}
// ----------------------------------------------------------------------
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
Preview(Context context) {
super(context);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
mCamera.stopPreview();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
처음실행후 종료하고
다시 실행 했을때의 화면


처음 실행하고 종료했을때의 log
D/dalvikvm( 101): GC freed 3962 objects / 215304 bytes in 201ms
W/KeyCharacterMap( 301): No keyboard for id 0
W/KeyCharacterMap( 301): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
D/CameraService( 227): stopPreview (pid 301)
D/CameraService( 227): stopPreview(), hardware stopped OK
다시 실행 했을때의 화면


처음 실행하고 종료했을때의 log
D/dalvikvm( 101): GC freed 3962 objects / 215304 bytes in 201ms
W/KeyCharacterMap( 301): No keyboard for id 0
W/KeyCharacterMap( 301): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
D/CameraService( 227): stopPreview (pid 301)
D/CameraService( 227): stopPreview(), hardware stopped OK
에러 발생시 log
I/ActivityManager( 53): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=android.demo/.camera16 }
D/CameraService( 227): CameraService::connect E (pid 301, client 0xd8c8)
D/CameraService( 227): CameraService::connect X (pid 301, new client 0xd8c8) rejected. (old pid 301, old client 0xd108)
D/AndroidRuntime( 301): Shutting down VM
W/dalvikvm( 301): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 301): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 301): java.lang.RuntimeException: Fail to connect to camera service
E/AndroidRuntime( 301): at android.hardware.Camera.native_setup(Native Method)
E/AndroidRuntime( 301): at android.hardware.Camera.<init>(Camera.java:102)
E/AndroidRuntime( 301): at android.hardware.Camera.open(Camera.java:84)
E/AndroidRuntime( 301): at android.demo.Preview.surfaceCreated(camera16.java:100)
E/AndroidRuntime( 301): at android.view.SurfaceView.updateWindow(SurfaceView.java:392)
E/AndroidRuntime( 301): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:264)
E/AndroidRuntime( 301): at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
E/AndroidRuntime( 301): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
E/AndroidRuntime( 301): at android.view.View.draw(View.java:6277)
E/AndroidRuntime( 301): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 301): at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
E/AndroidRuntime( 301): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
E/AndroidRuntime( 301): at android.view.View.draw(View.java:6277)
E/AndroidRuntime( 301): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 301): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1883)
E/AndroidRuntime( 301): at android.view.ViewRoot.draw(ViewRoot.java:1332)
E/AndroidRuntime( 301): at android.view.ViewRoot.performTraversals(ViewRoot.java:1097)
E/AndroidRuntime( 301): at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
E/AndroidRuntime( 301): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 301): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 301): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 301): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 301): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 301): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 301): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 301): at dalvik.system.NativeStart.main(Native Method)
I/Process ( 53): Sending signal. PID: 301 SIG: 3
I/dalvikvm( 301): threadid=7: reacting to signal 3
E/dalvikvm( 301): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
W/ActivityManager( 53): Launch timeout has expired, giving up wake lock!
W/ActivityManager( 53): Activity idle timeout for HistoryRecord{43977a38 android.demo/.camera16}
I/Process ( 301): Sending signal. PID: 301 SIG: 9
D/CameraService( 227): Client::~Client E (pid 227, client 0xd108)
I/ActivityManager( 53): Process android.demo (pid 301) has died.
I/WindowManager( 53): WIN DEATH: Window{4393f310 android.demo/android.demo.camera16 paused=false}
I/WindowManager( 53): WIN DEATH: Window{43944020 SurfaceView paused=false}
W/UsageStats( 53): Unexpected resume of com.android.launcher while already resumed in android.demo
D/CameraService( 227): Client::disconnect() E (pid 227 client 0xd108)
D/CameraService( 227): hardware teardown
D/CameraService( 227): removeClient (pid 227): no more strong reference
D/CameraService( 227): Client::disconnect() X (pid 227)
D/CameraService( 227): Client::~Client X (pid 227)
W/InputManagerService( 53): Got RemoteException sending setActive(false) notification to pid 301 uid 10026
I/ActivityManager( 53): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=android.demo/.camera16 }
D/CameraService( 227): CameraService::connect E (pid 301, client 0xd8c8)
D/CameraService( 227): CameraService::connect X (pid 301, new client 0xd8c8) rejected. (old pid 301, old client 0xd108)
D/AndroidRuntime( 301): Shutting down VM
W/dalvikvm( 301): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 301): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 301): java.lang.RuntimeException: Fail to connect to camera service
E/AndroidRuntime( 301): at android.hardware.Camera.native_setup(Native Method)
E/AndroidRuntime( 301): at android.hardware.Camera.<init>(Camera.java:102)
E/AndroidRuntime( 301): at android.hardware.Camera.open(Camera.java:84)
E/AndroidRuntime( 301): at android.demo.Preview.surfaceCreated(camera16.java:100)
E/AndroidRuntime( 301): at android.view.SurfaceView.updateWindow(SurfaceView.java:392)
E/AndroidRuntime( 301): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:264)
E/AndroidRuntime( 301): at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
E/AndroidRuntime( 301): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
E/AndroidRuntime( 301): at android.view.View.draw(View.java:6277)
E/AndroidRuntime( 301): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 301): at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
E/AndroidRuntime( 301): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
E/AndroidRuntime( 301): at android.view.View.draw(View.java:6277)
E/AndroidRuntime( 301): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 301): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1883)
E/AndroidRuntime( 301): at android.view.ViewRoot.draw(ViewRoot.java:1332)
E/AndroidRuntime( 301): at android.view.ViewRoot.performTraversals(ViewRoot.java:1097)
E/AndroidRuntime( 301): at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
E/AndroidRuntime( 301): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 301): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 301): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 301): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 301): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 301): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 301): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 301): at dalvik.system.NativeStart.main(Native Method)
I/Process ( 53): Sending signal. PID: 301 SIG: 3
I/dalvikvm( 301): threadid=7: reacting to signal 3
E/dalvikvm( 301): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
W/ActivityManager( 53): Launch timeout has expired, giving up wake lock!
W/ActivityManager( 53): Activity idle timeout for HistoryRecord{43977a38 android.demo/.camera16}
I/Process ( 301): Sending signal. PID: 301 SIG: 9
D/CameraService( 227): Client::~Client E (pid 227, client 0xd108)
I/ActivityManager( 53): Process android.demo (pid 301) has died.
I/WindowManager( 53): WIN DEATH: Window{4393f310 android.demo/android.demo.camera16 paused=false}
I/WindowManager( 53): WIN DEATH: Window{43944020 SurfaceView paused=false}
W/UsageStats( 53): Unexpected resume of com.android.launcher while already resumed in android.demo
D/CameraService( 227): Client::disconnect() E (pid 227 client 0xd108)
D/CameraService( 227): hardware teardown
D/CameraService( 227): removeClient (pid 227): no more strong reference
D/CameraService( 227): Client::disconnect() X (pid 227)
D/CameraService( 227): Client::~Client X (pid 227)
W/InputManagerService( 53): Got RemoteException sending setActive(false) notification to pid 301 uid 10026
2010.02.10 16:15:07
카메라 서비스 이용시 초기화를 하는 메서드가 없어서 그러는게 아닐까요?
종료시엔 실행중인 카메라서비스를 종료 후 실행을 해야 하는것으로 알고 있는...
제가 잘못 알고 있다면 다른 분들이 대답을 해주시길 바랍니다(저도 아직 초보인지라ㅎㅎ)
2010.02.10 16:29:36
mCamera.stopPreview();
mCamera.release();
mCamera = null;
디스트로이시에 릴리즈를 넣지 않아서 인듯..
mCamera.release();
mCamera = null;
디스트로이시에 릴리즈를 넣지 않아서 인듯..



