2015-11-03 114 views
0

我知道有很多像这样的问题。但是,没有任何解决方案适合我。我通过自学指南学习android。我的任务是使用Camera类实现摄像机服务。我知道相机已被弃用。不过,我打算使用Camera类来运行它。我无法连接到相机服务错误。我甚至没有收到相机预览。当我运行相机时,我所得到的只是一个黑屏和点击按钮,我点击图片。但是,第二次运行它会冻结我的手机,我必须拔出并放入电池再次工作。到目前为止,我已经把所有的权限,该权限相机类需要 清单:Android相机没有响应(无法连接到相机服务)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
    <uses-permission android:name="android.permission.CAMERA"></uses-permission> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 
    <uses-feature android:name="android.hardware.camera2.full"></uses-feature> 
    <application>....</application> 

我确保相机在所有需要的地方释放。我了解到,如果我们不正确释放相机,我们会发生此错误。 我的onPause()方法

@Override 
    public void onPause() 
    { 
     super.onPause(); 
     if(camera!=null) 
     { 
      camera.release(); 
      camera=null; 
     } 
} 

我的onResume方法

@Override 
public void onResume() 
{ 
    super.onResume(); 
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD) 
    { 
     camera.open(0); 

    } 
    else { 
     camera.open(); 

    } 

我surfaceDestroyed方法

@Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 
       if(camera!=null) 
       { 
        camera.stopPreview(); 
        camera.setPreviewCallback(null); 
        camera.release(); 
        camera=null; 
       } 
      } 

我surfaceCreated方法

public void surfaceCreated(SurfaceHolder holder) { 
      if(camera!=null) 
      { 
       try { 
        camera.setPreviewDisplay(holder); 
       } catch (IOException e) { 
        Log.e(TAG, "ERROR SETTING UP PREVIEW", e); 
       } 
      } 
     } 

我的控制台输出:

Process: course.examples.criminalintent, PID: 12954 
    java.lang.RuntimeException: Unable to resume activity {course.examples.criminalintent/course.examples.criminalintent.CrimeCameraActivity}: java.lang.RuntimeException: Fail to connect to camera service 

经过一番调试,我发现我的相机在整个时间都是空的。这解释了为什么我在屏幕上看不到相机预览。但是,我不明白为什么它冻结我的手机,我应该如何使它正常工作?请详细解释。谢谢!

回答

0

我想通了!我的onResume()方法错误的第一件事是它没有包含在try catch块中。此外,我用诸如(Camera.CameraInfo.CAMERA_FACING_FRONT)之类的常量替换常量0。

其次,我得到参数失败的错误。我通过删除setPreviewFormat(format)语句来删除该错误。

这里是我所做的更改:

更新的onResume()方法

try { 
       releaseCameraAndPreview(); 
       if (Id == 0) { 
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
       } 
       else { 
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
       } 
      } catch (Exception e) { 
       Log.e(getString(R.string.app_name), "failed to open Camera"); 
       e.printStackTrace(); 
      } 
相关问题