2011-01-14 6 views
3
나는 안드로이드 카메라 API로 작업하려고 다음 URL에서 제공되는 코드를 사용하고

: 이것은 내가 헛된 시도 몇 가지 질문을 제기했다안드로이드 : 여러 카메라 API 질문

http://marakana.com/forums/android/examples/39.html

지금까지의 답변을 찾으십시오.

1) 내 응용 프로그램은 세로 방향이어야하지만 위의 URL에 포함 된 모든 코드 예제는 모두 가로 방향에 의존하는 것 같습니다. 사실, 내가 지금까지 시도한 것이 무엇이든 상관없이, 풍경은 피할 수없는 것처럼 보인다. 그래서 같은 surfaceCreated(...)의 매개 변수를 강제로 시도 : 나는 surfaceChanged(...)에서 같은 일을하고 시도

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
parameters.set("rotation", "90"); 
camera.setParameters(parameters); 

. 다음과 같이 물론, 나는 또한 매니페스트에 세로로 내 방향을 설정하고있다 :

android:screenOrientation="portrait" 

사람이 내가 잘못을하고 해결 방법을하는 무슨을에 어떤 제안이 있습니까?

2) 제가 가지고있는 또 다른 질문은 카메라 리소스를 공개하는 것과 관련이 있습니다. 위에서 언급 한 기사의 코드에서 다음은 surfaceDestroyed(...) 방법으로 호출됩니다

camera.stopPreview(); 
camera = null; 

이 카메라 리소스를 해제 할 아무것도 없다, 그래서 당신은이 응용 프로그램, 본 카메라를 사용하는 모든 후속 응용 프로그램을 실행 한 후 작동하지. 이 문제를 해결하기 위해 오전 시도에서,이 같은 리소스를 해제하기 위해 전화를 추가 :

camera.stopPreview(); 
camera.release(); 
camera = null; 

이 문제,하지만, 내가 응용 프로그램을 닫을 때, 내가 가진 "강제 닫기"를 얻을 수 있다는 것입니다 다음 LogCat의 예외 :

FATAL EXCEPTION: main 
java.lang.RuntimeException: Method called after release() 
    at android.hardware.Camera.setHasPreviewCallback(Native Method) 
    at android.hardware.Camera.access$600(Camera.java:58) 
    at android.hardware.Camera.$EventHandler.handleMessage(Camera.java:344) 
    at android.os.Handler.dispatchMessage(Handler.java.99) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lanf.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    at dalvik.system.NativeStart.main(Native Method) 

아무도 내가 왜 카메라 자원을 공개 할 수 없는지 말할 수 있습니까?

감사합니다. 이 카메라 물건이 나를 미치게합니다.

P. HTC Evo에서이 모든 것을 테스트하고 있습니다.

답변

1

두 번째 질문 : here 누군가가 해결 방법을 게시했습니다.

8

(1) API 레벨 9를 개발중인 경우 developer website에 게시 된 코드를 사용해보십시오. 당신은 당신이 다음을 수행하는 것이 있는지 확인해야합니다 (2)의 경우

:

if (mCamera != null) { 
     mCamera.setPreviewCallback(null); 
     mCamera.release(); 
     mCamera = null; 
    } 

당신이 릴리스를 호출 기본적하기 전에()는 null로 setPreviewCallback해야합니다.

@Override 
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
    this.getHolder().removeCallback(this); 
    mCamera.stopPreview(); 

    mCamera.release(); 
    mCamera = null; 
    Log.e("surfaceDestroyed", "surfaceDestroyed"); 

} 

그런 다음, onResume 기능에 카메라를 다시 초기화 :이 카메라 스택이 코드를 수행

0

알려진 문제입니다.

0
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.setPreviewCallback(null); 
    mCamera.stopPreview(); 
    mCamera.release(); 
    mCamera = null; 
}