Не удалось взять изображение с фронтальной камеры: Android

Я не могу делать снимки с помощью передней камеры. У моего тестового устройства определенно есть передняя и задняя камера/функциональность. По какой-то причине фотографии снимаются только с камеры заднего вида. Вот что у меня есть. Примечание: камера и параметр установлены глобально.

@Override
 public void surfaceCreated(SurfaceHolder holder)
 {

 camera = Camera.open();
 parameter = camera.getParameters();

 Camera.Size size = getBestPreviewSize(surfaceView.getWidth(), surfaceView.getHeight(), parameter);
 parameter.setPreviewSize(size.width, size.height);

 try {
 camera.setPreviewDisplay(surfaceHolder);
 } catch (Throwable ignored) {
 Log.e(TAG, "set preview error: ", ignored);
 }
 camera.setParameters(parameter);

 } 
 }

В surfaceChanged() я запускаю предварительный просмотр камеры.

@Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
 int height)
 {
 // TODO Auto-generated method stub
 if(isPreview == true)
 {
 camera.stopPreview();
 isPreview = false;
 }

 if (camera != null)
 {
 try
 {

 camera.setPreviewDisplay(surfaceHolder);
 camera.setDisplayOrientation(90);
camera.startPreview();
 isPreview = true;
 }
 catch (IOException e)
 {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 }

В surfaceDestroyed() я освобождаю ресурсы камеры

@Override
 public void surfaceDestroyed(SurfaceHolder holder)
 {
 if (camera != null) {
 camera.stopPreview();

 camera.release();
 camera = null;
 isPreview = false; 
 }

 }

Вот ссылочный метод, который возвращает размер предварительного просмотра

private Camera.Size getBestPreviewSize(int width, int height,
 Camera.Parameters parameters) {
 Camera.Size result = null;

 for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
 if (size.width <= width && size.height <= height) {
 if (result == null) {
 result = size;
 } else {
 int resultArea = result.width * result.height;
 int newArea = size.width * size.height;

 if (newArea > resultArea) {
 result = size;
 }
 }
 }
 }

 this.size = result;
 return (result);
 }

Всякий раз, когда я хочу использовать переднюю камеру, передняя камера является дополнительной функцией, обычно используется задняя камера - я frontCamera() метод frontCamera(). Весь этот метод устанавливает id камеры в 2, который, я считаю, является флагом frontCamera(). Затем я устанавливаю параметры с обновленными параметрами и делаю снимок.

private void frontCamera() {

 parameter = camera.getParameters();

 cameraId = findFrontFacingCamera();

 if (cameraId < 0) {
//no front face camera

 } else {

 parameter.set("camera-id", 2);
 camera.setParameters(parameter);
 }

 camera.takePicture(null,
 null, myPictureCallback_JPG);

 }

Моя проверка на лицевую камеру выполняется в findFrontFacingCamera()

private int findFrontFacingCamera() {
 cameraId = -1;
 //search for the front facing camera
 int numberOfCameras = Camera.getNumberOfCameras();
 for (int i = 0; i
<p> Заключительные примечания: <code>numberOfCameras возвращает 2, указывая, что у моего тестового устройства две камеры. Кроме того, я достигаю этого тега "Front Camera found", который еще больше убеждает меня, что это не проблема с оборудованием. По какой-то причине этот код будет принимать только изображения с задней камерой. Есть идеи? Заранее спасибо.

1 ответ

Не используйте .open(). Используйте .open(cameraID) и передайте ему идентификатор камеры передней камеры.

licensed under cc by-sa 3.0 with attribution.