我正在编写相机应用程序,每当我调用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(相机2)。
从这一点开始你应该使用camera2 api,因为它具有更强大的功能,并且还有更好的图像处理管道。
注意仅限于排除API 21(Lolipop),即不适用于Lolipop 以及。
答案 0 :(得分:24)
您手动将应用程序上传到手机。这就是相机许可未获批准的原因。您必须打开设置 - >应用程序(或类似的东西)并手动批准此权限。
答案 1 :(得分:9)
使用以下方法
android.hardware.Camera.open(int cameraId)
你应该传递cameraId,如果你想要前置摄像头,你可以使用以下方法
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(),否则它将保持锁定状态并且不可用于其他应用程序。
您的应用程序一次只能激活一个Camera对象 对于特定的硬件相机。
答案 2 :(得分:9)
在Android 6中,请确保您请求相机的权限。相机访问被视为'dangerous permissions'之一。
答案 3 :(得分:8)
确保您的应用具有相机权限,例如
<uses-permission android:name="android.permission.CAMERA"/>
AndroidManifest.xml中的
答案 4 :(得分:3)
我得到了答案: 这是针对棉花糖许可问题: 在项目中添加:
第1步:
private static final int REQUEST_GET_ACCOUNT = 112;
private static final int PERMISSION_REQUEST_CODE = 200;
步骤2:
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();
}
}
步骤3:
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();
}
答案 5 :(得分:0)
在我的情况下,您的代码在AndroidManifest.xml
中添加后会起作用 <uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>
答案 6 :(得分:0)
完成工作后尝试关闭相机 在我的情况下,我使用mScannerView.stopCamera(),因为我用它来扫描代码QR。