【问题标题】:java.lang.RuntimeException: Fail to Connect to camera servicejava.lang.RuntimeException:无法连接到相机服务
【发布时间】:2011-10-16 17:42:45
【问题描述】:

我尝试制作一个可以打开和关闭相机闪光灯的应用。 我的 atm 代码如下所示:

Camera flash;
Camera.Parameters params;

flash = Camera.open();
params = flash.getParameters();

params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);        
flash.setParameters(params);

在清单 xml 中:

<permission android:name="android.permission.FLASHLIGHT"  

android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
          android:protectionLevel="normal" />

<permission android:name="android.permission.CAMERA"> </permission>

每次我运行代码时,应用程序都会在“flash = Camera.open();”处崩溃出现此错误:

java.lang.RuntimeException: 连接相机服务失败

我做错了什么?

【问题讨论】:

  • 尽管清单部分存在格式问题,但我想说您必须为手电筒和相机使用 标签而不是 标签。另外为了清楚起见,请发布正确格式的清单部分(可能还有整个堆栈跟踪,如果这是一个权限问题,应该在 logcat 中的异常之前有一个提示)。

标签: android camera


【解决方案1】:

要访问设备摄像头,您必须像这样在您的 Android Manifest 中声明 CAMERA 权限,

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" />

【讨论】:

  • 这并不完全正确,您不需要使用 uses-feature 标签来访问相机:“声明的 元素仅供参考,这意味着 Android 系统本身不会检查在安装应用程序之前匹配设备上的功能支持。但是,其他服务(例如 Google Play)或应用程序可能会检查您的应用程序的 声明,作为处理或与您的应用程序交互的一部分。" developer.android.com/guide/topics/manifest/…
【解决方案2】:

您可能忘记在onDestroy 中调用release

例如:

@Override
protected void onDestroy() {
    if (mCamera != null) {
        mCamera.release();
    }
    super.onDestroy();
}

【讨论】:

    【解决方案3】:

    通常这个问题是由于缺少相机请求权限,正如其他用户已经说过的那样。

    但是,只是在这里注册另一个原因,如果您尝试使用不存在的 cameraID 打开相机,您将收到同样的错误

    java.lang.RuntimeException: 无法连接到相机服务

    【讨论】:

      【解决方案4】:

      您需要在 android 6.x 之前以编程方式添加新的请求权限。

       private static final int MY_PERMISSIONS_REQUEST_CAMERA = 555;
      
      if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                  ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
              } else {
                  IntentIntegrator.forSupportFragment(this).initiateScan();
              }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
          switch (requestCode) {
              case MY_PERMISSIONS_REQUEST_CAMERA: {
                  if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                      IntentIntegrator.forSupportFragment(this).initiateScan();
                  } else {
                      FragmentHelper.popFragment(getActivity(), null, null);
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多