【问题标题】:W/CameraBase﹕ An error occurred while connecting to camera: 0 on camera.open() callW/CameraBase:连接到相机时发生错误:camera.open()调用上的0
【发布时间】:2014-12-03 09:37:10
【问题描述】:

我正在编写一个相机应用程序,每当我调用 camera.open() 时应用程序崩溃,然后我收到此错误:

W/CameraBase﹕ An error occurred while connecting to camera: 0

这是我打开相机的方式:

public void getCameraInstance(){
    mCamera = null;

    try 
    {
        mCamera = Camera.open(); // attempt to get a Camera instance
    }

    catch (Exception e)
    {
        // Camera is not available (in use or does not exist)

    }
}

更新:

如果您正在阅读本文,请注意这是针对原始相机 API 的,不再应用最新版本的相机 API (camera2)。

您应该从现在开始使用 camera2 api,因为它具有更强大的功能并且还具有更好的图像处理管道。

注意仅在不包括 API 21 (Lolipop) 之前有效,即不适用于 Lolipop 及以上。

【问题讨论】:

  • 您使用哪种设备?它有工作的相机吗?您是否在清单中请求相机权限?你试过open(0)open (1)吗?
  • 我使用的是 moto g,虽然我尝试过使用模拟相机并且遇到了同样的问题
  • 我看到您首先将 camera 设置为 null。如果您的camera 对象不为空,您需要先调用camera.release(),然后才能打开一个新对象。
  • 好的,谢谢,我回家后试试
  • 结论OP在哪里?有 2 个人去帮助你,你得到了 4 个赞成票……你的工作在哪里??

标签: android android-activity android-camera


【解决方案1】:

您手动将应用程序上传到手机。这就是为什么相机权限不被批准的原因。您必须打开设置->应用程序(或类似的东西)并手动批准此权限。

【讨论】:

  • 我的意思是在你的手机上打开设置,并批准你的应用程序的相机权限))
  • 为什么这被否决了?这正是导致这里问题的原因。我必须在应用程序设置中手动批准相机权限。
  • 这是最好的答案!它是唯一解释正在发生的事情并提供最有意义的解决方案的方法。
  • 谢谢,这是我从 Android Studio 运行应用程序时遇到的问题
  • 谢谢!解决了我的问题!
【解决方案2】:

在 Android 6 中,请确保您为摄像头请求权限。摄像头访问被视为'dangerous permissions' 之一。

【讨论】:

  • 或设置目标 API 级别
  • 这不是一个好的解决方案。你最终将不得不支持 API 22。
【解决方案3】:

使用下面的方法

android.hardware.Camera.open(int cameraId)

你应该传递cameraId,如果你想要前置摄像头Id你可以使用以下方法

private int findFrontFacingCamera() {

    // Search for the front facing camera
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
  1. 如果同一个摄像头被其他应用打开,会抛出RuntimeException。

  2. 您必须在使用完相机后调用 release(),否则相机将保持锁定状态,对其他应用程序不可用。

  3. 您的应用程序一次应该只有一个处于活动状态的相机对象 对于特定的硬件相机。

【讨论】:

    【解决方案4】:

    确保您的应用具有相机权限,例如

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

    在 AndroidManifest.xml 中

    【讨论】:

    • 是的,这是我做的第一件事
    • 对于临时的 stackoverflow 搜索者来说,这很可能是导致错误的原因。
    【解决方案5】:

    我得到了答案: 这是棉花糖权限问题: 将此添加到您的项目中:

    第 1 步:

     private static final int REQUEST_GET_ACCOUNT = 112;
     private static final int PERMISSION_REQUEST_CODE = 200;
    

    第二步:

     int currentapiVersion = android.os.Build.VERSION.SDK_INT;
            if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
                if (checkPermission()) {
                    Toast.makeText(getApplicationContext(), "Permission already granted", Toast.LENGTH_LONG).show();
                } else {
                    requestPermission();
                }
            }
    

    第三步:

    private boolean checkPermission() {
            int result = ContextCompat.checkSelfPermission(getApplicationContext(), GET_ACCOUNTS);
            int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA);
            return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
        }
    
        private void requestPermission() {
            ActivityCompat.requestPermissions(this, new String[]{GET_ACCOUNTS, CAMERA}, REQUEST_GET_ACCOUNT);
            ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
        }
    
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
            switch (requestCode) {
                case PERMISSION_REQUEST_CODE:
                    if (grantResults.length > 0) {
    
                        boolean locationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                        boolean cameraAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;
    
                        if (locationAccepted && cameraAccepted)
                            Toast.makeText(getApplicationContext(), "Permission Granted, Now you can access location data and camera", Toast.LENGTH_LONG).show();
                        else {
                            Toast.makeText(getApplicationContext(), "Permission Denied, You cannot access location data and camera", Toast.LENGTH_LONG).show();
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                if (shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE)) {
                                    showMessageOKCancel("You need to allow access to both the permissions",
                                            new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                                        requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE},
                                                                PERMISSION_REQUEST_CODE);
                                                    }
                                                }
                                            });
                                    return;
                                }
                            }
    
                        }
                    }
    
                    break;
            }
        }
    
        private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
            new android.support.v7.app.AlertDialog.Builder(CaptureActivity.this)
                    .setMessage(message)
                    .setPositiveButton("OK", okListener)
                    .setNegativeButton("Cancel", null)
                    .create()
                    .show();
        }
    

    【讨论】:

    • 你太棒了..我已经被这个问题困扰了好几天了,这很有效。谢谢
    • @Sri 仅供参考,您应该发布另一个问题,因为此问题对 API 20 以上的任何内容均无效,这也适用于您的 vels
    【解决方案6】:

    完成工作后尝试关闭相机 就我而言,我使用 mScannerView.stopCamera() 因为我用它来扫描二维码。

    【讨论】:

    • 在我的情况下,当我从“onResume()”调用 startCamera() 两次时出现错误。第二个失败并导致此问题。即使在我调用 stopCamera() 之后它也不起作用。因此,请确保我们不会多次调用 startCamera()。
    【解决方案7】:

    在我的情况下,在 AndroidManifest.xml 中添加此代码后,您的代码可以工作

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

    【讨论】:

    • 你不需要uses-feature。这只会过滤您在商店中的应用。
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多