连接到摄像机时出错:0 ---无法连接到摄像机服务

时间:2016-02-08 20:31:46

标签: java android camera

当我在这个特定的Nexus 5上打开相机时,我遇到了手机特定的问题。An error occurred while connecting to camera: 0 --- Fail to connect to camera service错误。在至少十几个其他手机上一切正常。在Nexus 5上使用相机的其他应用程序不会崩溃(表明并非所有无法访问相机的应用程序都是我的。)

还有其他一些问题,我尝试了所有这些问题。他们都谈论缺少权限,并确保相机在使用后被销毁。

要清楚我的清单请求并正确使用相机:

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

我在摧毁时释放相机:

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

    _surfaceHolder.removeCallback(this);
}

你能想到我得到这个的任何理由吗?我怀疑是某种bug,因为我使用相机而不是相机2,但这是一个疯狂的猜测。 Reading the updates for API 6.0相机上有一节说:

  

在此版本中,用于访问共享资源的模型   相机服务已经从以前的“先到先得,改变了   服务“访问模型到高优先级进程的访问模型   很受欢迎。

再一次没有重写整个应用程序来使用camera2(不是一个选项)我不能肯定地说是发生了什么。

以下是我打开相机的代码(以及除Nexus 5之外的其他所有手机的功能)

private void setInitialCamera()
{
    try
    {
        if (_isBackFacing == true)
        {
            _camera = Camera.open(0);
        } else
        {
            _camera = Camera.open(1);
        }
    } catch (RuntimeException e)
    {
        Log.d("Runtime Exception","Error " + e);
        e.printStackTrace();
    } catch (Exception e)
    {
        Log.d("Camera Error: ", " Android is unable tell what the error was");
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:13)

所以看起来罪魁祸首 与手机经历的6.0.1更新有关。

虽然在其他手机上没有发生这种情况,但它确实在失败的Nexus 5上发生。

6.0.1更新允许用户为应用设置个人权限。所以不知何故,相机的延迟被切断了。重新开启此问题解决了问题。

要到达那里,请转到Settings -> Apps -> [App Name] -> Permissions

enter image description here

答案 1 :(得分:0)

让用户手动为您的应用设置权限不是一个好方法。请改用以下代码,这将在您的应用程序首次启动时提示用户权限。

首先设置您的请求代码,该代码用于识别接受或拒绝的请求:

private static final int MY_CAMERA_REQUEST_CODE = 100;

然后询问用户是否可以使用相机:

if (checkSelfPermission(Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
}
else {
    // permission has been already granted, you can use camera straight away
}

最后检查是否授予了权限:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == MY_CAMERA_REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // user accepted your request, you can use camera now from here
        }
        else {
            // user denied your request, you can now handle their decision
        }
    }
}