2014-01-17 2 views
1

안드로이드 안심 안전 개폐 카메라에 관한 안드로이드 지침 및 질문을 이미 읽었지만 답변을 찾지 못했습니다. 여기 (서피스 뷰 SurfaceView를 확장 CameraView 클래스 내부) 카메라를 열기위한 내 코드입니다 :안드로이드 카메라 안전 개폐

@Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { 
       this.camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      } else { 
       this.camera = Camera.open(); 
      } 
     } catch (IOException ioe) { 
      ioe.printStackTrace(System.out); 
     } 
    } 

내가 (때문에 Nexus7의 camera.open에 인스턴스에 대한 BUILD_SDK을 확인하고 있습니다) 작동하지 않습니다 - 나는 카메라를 사용해야합니다 .open (0) -하지만 camera.open (INT)는 SDK 8에서 사용할 수 없습니다 그리고 여기 내 폐쇄 카메라 조각입니다 : 활동 내 CameraView와 연결했을 때 나는 또한 releaseCamera() 함수를 사용하고

@Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     releaseCamera(); 
    } 

    public void releaseCamera(){ 
     if (camera != null) { 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); 
      camera = null; 
     } 
    } 

onPause 상태로 이동합니다. 이 코드는 대부분의 장치에서 제대로 작동하지만 (Galaxy GIO, LG 4X HD 및 Galaxy S2에서 확인)이 코드 조각으로 앱을 게시했으며 카메라에 연결된 충돌을 계속보고하는 사용자는 여기에서 logcat입니다 :

java.lang.RuntimeException: Fail to connect to camera service 
at android.hardware.Camera.native_setup(Native Method) 
at android.hardware.Camera.<init>(Camera.java:423) 
at android.hardware.Camera.open(Camera.java:384) 
at com.artostolab.xray.CameraView.surfaceCreated(CameraView.java:101) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:606) 
at android.view.SurfaceView.access$000(SurfaceView.java:88) 
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183) 
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:692) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2123) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4879) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) 
at android.view.Choreographer.doCallbacks(Choreographer.java:579) 
at android.view.Choreographer.doFrame(Choreographer.java:548) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:153) 
at android.app.ActivityThread.main(ActivityThread.java:5297) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
at dalvik.system.NativeStart.main(Native Method) 

그리고 자신의 장치 : LG 옵티머스 G (geehrc4g) LG 옵티머스 L7 (U0)
IRIS504Q

당신은 어떤 생각이 왜 이런 일이 일어나고 있습니까? 미리 감사는

UPDATE 2014년 1월 21일는

나는 CommonsWare에 의해 제안 된 카메라를 다시 찾기 위해 이제 기능을 사용하고 그러나 지금은 인기없는 장치와 같은 오류 형태로 다른 사용자를 이동, 잘 작동했다 (Htc EVo 3D, 도시 생활, Huawei U8815). 이 문제의 원인을 알고 있습니까? 여기에 (I 주요 질문을 업데이트) 그들에서 로그 캣입니다 -

java.lang.RuntimeException: Fail to connect to camera service 
at android.hardware.Camera.native_setup(Native Method) 
at android.hardware.Camera.<init>(Camera.java:300) 
at android.hardware.Camera.open(Camera.java:253) 
at com.artostolab.xray.CameraView.surfaceCreated(CameraView.java:105) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:552) 
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:350) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.View.draw(View.java:6892) 
at android.widget.FrameLayout.draw(FrameLayout.java:357) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1884) 
at android.view.ViewRoot.draw(ViewRoot.java:1524) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1260) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1864) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3683) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
at dalvik.system.NativeStart.main(Native Method) 

는 그리고 내 기능은 적절한 카메라를 찾는

다음
public int findBackCamera() { 
     int cameraId = -1; 
     int numberOfCameras = Camera.getNumberOfCameras(); 
     for (int i = 0; i < numberOfCameras; i++) { 
      Camera.CameraInfo info = new Camera.CameraInfo(); 
      Camera.getCameraInfo(i, info); 
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 
       cameraId = i; 
       break; 
      } 
     } 
     return cameraId; 
    } 
+0

새 질문을 열지 않으시겠습니까? 추가 비용은 들지 않지만 따르고 대답하기가 훨씬 쉽습니다. FWIW, 새 코드는 백 카메라가 있는지 확인하지 않고'cameraId == - 1'로 작업하면 앱이 다운됩니다. –

답변

1

입니다

을 카메라

을 여는 내 코드 해당 코드가 올바르지 않습니다. open()CAMERA_FACING_BACK이 아닌 카메라의 ID를 사용합니다.

+0

CAMERA_FACING_BACK 정수 값을 반환하지 않습니까? – Saqib

+0

yep Camera.CameraInfo.CAMERA_FACING_BACK은 0을 반환합니다. 상수입니다. – user1275995

+0

@Saqib :'Random.nextInt()'도 마찬가지입니다. 'open()'과 함께 임의의 숫자를 사용할 수 없습니다. 'facing '이'CAMERA_FACING_BACK'으로 설정된'CameraInfo'를 통해 카메라를 반복하고 카메라를 찾으십시오. [이 튜토리얼] (http://www.vogella.com/tutorials/AndroidCamera/article.html#tutorial_cameraapi)의'findFrontFacingCamera()'메소드를보고 정면이 아닌 뒷면 카메라를 사용하도록 수정하십시오. – CommonsWare