2014-01-17 66 views
1

我已经阅读了关于Android中安全开启/关闭相机堆栈的android指南和问题,但是我还没有找到答案。 这里是我的开启相机(延伸SurfaceView CameraView类中)的代码片段:Android相机安全开启/关闭

@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); 
     } 
    } 

我检查BUILD_SDK因为实例上Nexus7 camera.open为()不工作 - 我必须使用相机。开(0) - 但camera.open(INT)不提供SDK 8.这是我的闭幕式相机片断:

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

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

我还使用releaseCamera()函数时我CameraView活动连接进入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,城市生活,华为U8815)。你知道什么可能导致这个问题?下面是从他们的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: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()取相机的ID,而不是CAMERA_FACING_BACK

+0

不CAMERA_FACING_BACK是否返回整数值? – Saqib

+0

yep Camera.CameraInfo.CAMERA_FACING_BACK返回0 - 这是一个常量 – user1275995

+0

@Saqib:所以'Random.nextInt()'。你也不能在'open()'中使用随机数。请遍历相机并通过其''''设置为'CAMERA_FACING_BACK'的'CameraInfo'来查找相机。请参阅[本教程](http://www.vogella.com/tutorials/AndroidCamera/article.html#tutorial_cameraapi)中的'findFrontFacingCamera()'方法,并将其修改为使用后置摄像头而不是前端。 – CommonsWare