2015-11-30 3 views
2

Я знаю, что задаю вопрос, возможно, дублируем. , но я пробовал все, но не преуспел ни в одном. я есть попробовать следующие вещи, чтобы переключить камеру:Как переключиться с задней камеры на переднюю камеру нажатием кнопки?

numberOfCamera = Camera.getNumberOfCameras(); 
      if(camId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
       camId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
       Toast.makeText(getApplicationContext(), "BACK TO FRONT" , 
    1000).show(); 
        try { 
         camera.release(); 
         camera = Camera.open(camId); 
         camera.setPreviewDisplay(surfaceHolder); 
         camera.startPreview(); 
         previewing = true; 
        } catch (RuntimeException e) { 

       } catch (IOException e) {} 
      }else if(camId == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
       camId = Camera.CameraInfo.CAMERA_FACING_BACK; 
       Toast.makeText(getApplicationContext(), "FRONT TO BACK" , 



    1000).show(); 
         try { 
          camera.release(); 
          camera = Camera.open(camId); 
          camera.setPreviewDisplay(surfaceHolder); 
          camera.startPreview(); 
         } catch (RuntimeException e) { 

       } catch (IOException e) {} 
      } 

--this код не working..it показывает toast..but не переключение камеры.

+0

В вашем коде для каждого вызова исключения e.printStackTrace(), и получить журналы и опубликовать их здесь. –

+0

попробуйте вызвать 'camera.stopPreview()' before' camera.release() ' – calvinfly

+0

@calvinify .. не работает –

ответ

1

Так я сделал это на побочном проекте. Это custom surface view, который определяет способ переключения камеры.

Примечание: согласно комментарию А., мой первоначальный ответ был неправильным. Я обновил ответ, но я его не тестировал и не обновлял связанный файл.

Вот краткое описание того, что сделано:

Вам необходимо текущую ID камеры в классе переменной

int currentCameraId; 

резервного копирования в Camera.Parameters

Вам нужно повторно использовать информацию о высоте и ширине позже.

Camera.Parameters parameters = camera.getParameters(); 

Остановить просмотр

if (inPreview) { 
    camera.stopPreview(); 
} 

релиз камеры

camera.release(); 

Получить новый идентификатор камеры

int cameraCount = Camera.getNumberOfCameras(); 
if (cameraCount == 2) { 
    // simply switch between 0 and 1 if there are only 2 cameras 
    currentCameraId = currentCameraId == 0 ? 1 : 0; 
} else { 
    Camera.CameraInfo currentCameraInfo = new Camera.CameraInfo(); 
    Camera.getCameraInfo(currentCameraId, currentCameraInfo); 
    // switch between front and back facing 
    int wantedCameraFacing = currentCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ? Camera.CameraInfo.CAMERA_FACING_BACK : Camera.CameraInfo.CAMERA_FACING_FRONT; 
    currentCameraId = switchCamera(cameraCount, wantedCameraFacing); 
} 

метод switchCamera (непроверенные)

int switchCamera(int cameraCount, int wantedCameraFacing) { 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    for (int camId = 0; camId < cameraCount; camId++) { 
     Camera.getCameraInfo(camId, cameraInfo); 
     if (cameraInfo.facing == wantedCameraFacing) { 
      // selects the 1st camera which faces the correct way 
      return camId; 
     } 
    } 
} 

Открыть камеры

camera = Camera.open(currentCameraId); 

Init просмотр с сохраненными параметрами

camera.setPreviewDisplay(sHolder); 
// define parameters, e.g. parameters.setPreviewSize() 
camera.setParameters(parameters); 

Start Preview

camera.startPreview(); 

Использование

Установите этот пользовательский вид в макете деятельности. Создайте функцию обратного вызова для действия вашей кнопки onClick. Затем вы можете просто позвонить:

public void switchCamera(View v) { 
     preview.switchCamera(); 
} 
+1

Действительно похоже, нет никакой связи между 'CameraInfo' и параметром' Camera.open() ', я думаю, мне просто повезло. Спасибо за указание на это. –

+0

не могли бы вы ответить на свой вопрос, пожалуйста? –

+1

Это должно сделать это, но я не тестировал. –

Смежные вопросы