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
相机错误“无法连接到相机”或在某些手机中出现错误“相机正在被另一个应用程序使用”