2014-01-24 3 views
0

Я хотел бы переключиться между задней и передней камерой для записи видео. Это мой код:Не удалось подключиться к службе камеры в Android

public void surfaceCreated(SurfaceHolder holder) { 

    if (usecamera) { 
     camera = Camera.open(0); 
     camera.setDisplayOrientation(90); 

     try { 
      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
      previewRunning = true; 
     } 
     catch (IOException e) { 
      Log.e(LOGTAG,e.getMessage()); 
      e.printStackTrace(); 
     } 
    }  

} 


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    if (!recording && usecamera) { 
     if (previewRunning){ 
      camera.stopPreview(); 
     } 

     try { 
      Camera.Parameters p = camera.getParameters(); 

      p.setPreviewSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight); 

      camera.setParameters(p); 

      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
      previewRunning = true; 
     } 
     catch (IOException e) { 
      Log.e(LOGTAG,e.getMessage()); 
      e.printStackTrace(); 
     } 

     prepareRecorder(); 
    } 
} 


public void surfaceDestroyed(SurfaceHolder holder) { 
    if (recording) { 
     recorder.stop(); 
     recording = false; 
    } 
    recorder.release(); 
    if (usecamera) { 
     previewRunning = false; 
     //camera.lock(); 
     camera.release(); 
    } 

} 

В первом случае предварительный просмотр задней камеры правильна, но ошибка при попытке изменить камеру:

Кнопка для изменения:

changeCamera.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if (Camera.getNumberOfCameras()>=2) { 
        camera.stopPreview(); 
        camera.release(); 
        //"which" is just an integer flag 
        switch (which) { 
        case 0: 
         camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
         which = 1; 
         break; 
        case 1: 
         camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
         which = 0; 
         break; 
        } 
        try { 
         camera.setPreviewDisplay(holder); 
         camera.startPreview(); 
        } catch (IOException exception) { 
         camera.release(); 
         camera = null; 
        } 
       } 

     } 
    }); 
+0

Пожалуйста, разместите сообщения, которые вы видите в logcat. Вероятно, есть не только стек исключений вашего приложения, но и некоторые сообщения об ошибках от службы камеры. –

ответ

2

К сожалению, Android Camera API не так-то просто понять. Есть два ИНТconstants:

public final static int Camera.CameraInfo.CAMERA_FACING_BACK = 0; 
public final static int Camera.CameraInfo.CAMERA_FACING_FRONT = 1; 

и есть методы, такие как Camera.open(), которые ожидают int cameraId параметра.

Но это ошибка в использовании констант, приведенных выше для Camera.open() или CamcorderProfile.get(). cameraId является для первой камеры, для второго, 2 для третьих, так далее, вплоть до Camera.getNumberOfCameras()-1. Вы можете проверить направление из камеры с определенным cameraId следующим образом:

Camera camera = Camera.open(cameraId); 
int facing = camera.getCameraInfo().facing(); 

Значение напротив гарантированно будет либо Camera.CameraInfo.CAMERA_FACING_BACK или Camera.CameraInfo.CAMERA_FACING_FRONT.

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