W/CameraBase:连接到相机时发生错误:camera.open()调用上的0

Posted

技术标签:

【中文标题】W/CameraBase:连接到相机时发生错误:camera.open()调用上的0【英文标题】:W/CameraBase﹕ An error occurred while connecting to camera: 0 on camera.open() call 【发布时间】: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 个赞成票……你的工作在哪里?? 【参考方案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;

    如果同一个摄像头被其他应用打开,会抛出RuntimeException。

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

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

【讨论】:

【参考方案4】:

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

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

在 AndroidManifest.xml 中

【讨论】:

是的,这是我做的第一件事 对于临时的 *** 搜索者来说,这很可能是导致错误的原因。【参考方案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 延伸阅读:developer.android.com/training/permissions/requesting.html【参考方案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。这只会过滤您在商店中的应用。

以上是关于W/CameraBase:连接到相机时发生错误:camera.open()调用上的0的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法连接到相机服务@Android marshmallow

错误:无法连接到相机服务@Android marshmallow

相机错误“无法连接到相机”或在某些手机中出现错误“相机正在被另一个应用程序使用”

如何在统一 2d 中将相机连接到生成的玩家?

Prestashop 在尝试测试连接时无法连接到数据库“发生错误:”

RuntimeException:无法连接到相机服务?