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

10

我尝试创建一个可以开关相机闪光灯的应用程序。 我目前拥有的代码如下:

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: 连接相机服务失败

我做错了什么?


5
尽管清单部分存在格式问题,但我认为你必须使用<uses-permission />标记而不是<permission />标记来控制手电筒和相机的权限。另外,为了使这一点更加清晰,请发布正确格式的清单部分(如果这是一个权限问题,则在logcat中异常之前应该有提示,可能需要发布整个堆栈跟踪)。 - user658042
4个回答

35

要访问设备相机,您必须在Android清单文件中声明CAMERA权限,例如:

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

10
这并不完全正确,您不需要使用<uses-feature>标签来访问相机:"声明的<uses-feature>元素仅用作信息,这意味着Android系统在安装应用程序之前不会检查设备上的匹配特性支持。但是,其他服务(如Google Play)或应用程序可能会在处理或与您的应用程序交互时检查您的应用程序的<uses-feature>声明。" http://developer.android.com/guide/topics/manifest/uses-feature-element.html - stoefln

9

您可能忘记在onDestroy中调用释放函数。

例如:

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

3
通常这个问题是由于缺少相机请求权限造成的,正如其他用户所说。
但是,还有一个原因需要注意,如果您尝试使用不存在的相机ID打开相机,则会收到同样的错误信息:

java.lang.RuntimeException: Fail to Connect to camera service


3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接