W/CameraBase: при подключении к камере произошла ошибка: 0 на вызов camera.open()
Я пишу приложение для камеры, и всякий раз, когда я вызываю 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)
}
}
UPDATE:
Если вы читаете это, обратите внимание, что это относится к оригинальному API-интерфейсу камеры и больше не применяется к последней версии камеры api (camera2).
С этого момента вы должны использовать camera2 api, поскольку он имеет большую функциональность и также имеет лучший конвейер обработки изображений.
ПРИМЕЧАНИЕ ТОЛЬКО ДЕЙСТВИТЕЛЬНО ДЛЯ исключения API 21 (Lolipop), то есть не применяется к Lolipop
и выше.
Ответы
Ответ 1
Чтобы использовать следующий метод
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(), когда вы закончите с помощью камеры, иначе он останется заблокированным и будет недоступен для других приложений.
-
В вашем приложении должен быть включен только один объект камеры
для конкретной аппаратной камеры.
Ответ 2
Вы вручную загрузили приложение на телефон. Вот почему разрешение камеры не одобрено. Вам нужно открыть настройки- > приложения (или что-то в этом роде) и одобрить это разрешение вручную.
Ответ 3
В Android 6 убедитесь, что вы запрашиваете разрешение для камеры. Доступ к камере считается одним из 'опасных разрешений.
Ответ 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;
step2:
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();
}
}
step3:
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();
}
Ответ 6
В моем случае ваш код работает после добавления этого в AndroidManifest.xml
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>