【问题标题】:An error occurred while connecting to camera: 0 --- Fail to connect to camera service连接摄像头时出错:0 --- 连接摄像头服务失败
【发布时间】:2019-04-19 21:54:29
【问题描述】:

当我在这个特定的 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);
}

你能想到我得到这个的任何原因吗?我怀疑存在某种错误,因为我使用的是相机而不是相机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();
    }
}

【问题讨论】:

    标签: java android camera


    【解决方案1】:

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

    虽然这在其他手机上没有发生,但在失败的 Nexus 5 上却发生了。

    6.0.1 更新允许用户为应用设置单独的权限。所以不知何故,相机的权限被关闭了。重新启用此功能可解决此问题。

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

    【讨论】:

      【解决方案2】:

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

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

      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
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2011-12-31
        • 2013-05-13
        相关资源
        最近更新 更多