2015-01-14 2 views
2

Я хочу использовать функцию камеры переключателя. В настоящее время я разработал объект камеры, который отлично работает для задней камеры, но не работает для передней камеры. И я не могу найти решение для переключения между передней и задней камерами. Вот мой код ..!Переключение на фронтальную камеру и обратно Камера Android SurfaceView

public class MyCamera extends Activity implements SurfaceHolder.Callback, 
    Camera.ShutterCallback, Camera.PictureCallback { 
    Camera mCamera; 
    SurfaceView mPreview; 
    String filePath; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.camera_preview); 
     mPreview = (SurfaceView) findViewById(R.id.preview); 
     mPreview.getHolder().addCallback(this); 
     mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mCamera = Camera.open(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mCamera.stopPreview(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mCamera.release(); 
     Log.d("CAMERA", "Destroy"); 
    } 

    public void onCancelClick(View v) { 
     finish(); 
    } 

    public void onSnapClick(View v) { 
     mCamera.takePicture(this, null, null, this); 
    } 

    @Override 
    public void onShutter() { 
     Toast.makeText(this, "Click!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream fos = null; 
     try { 
      filePath = "/sdcard/test.jpg"; 
      fos = new FileOutputStream(filePath); 
      fos.write(data); 
      fos.close(); 
      // Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } finally { 
      Intent i = getIntent(); 
      i.putExtra("Path", filePath); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
     camera.startPreview(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_FRONT, info); 
     int rotation = this.getWindowManager().getDefaultDisplay() 
       .getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
     case Surface.ROTATION_0: 
      degrees = 0; 
      break; // Natural orientation 
     case Surface.ROTATION_90: 
      degrees = 90; 
      break; // Landscape left 
     case Surface.ROTATION_180: 
      degrees = 180; 
      break;// Upside down 
     case Surface.ROTATION_270: 
      degrees = 270; 
      break;// Landscape right 
     } 
     int rotate = (info.orientation - degrees + 360) % 360; 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setRotation(rotate); 
     mCamera.setParameters(params); 
     mCamera.setDisplayOrientation(90); 
     mCamera.startPreview(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mCamera.setPreviewDisplay(mPreview.getHolder()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.i("PREVIEW", "surfaceDestroyed"); 
    } 
} 
+0

Это может помочь вам: http://stackoverflow.com/questions/6599454/switch-back -front-camera-on-fly – bish

+0

@bish Я хочу решение для своего кода, потому что у меня есть свои собственные модификации, такие как просмотр и захват только в портретном режиме .. :( –

ответ

10

Попытка ниже кода

mCamera= Camera.open(cameraId); 

0 для CAMERA_FACING_BACK

1 для CAMERA_FACING_FRONT

Справочник Camera.open(int)

Camera Info Constants

+0

Извините, этот код неверен. Целочисленный индекс, используемый для Camera.open(), не является одной из констант в классе Camera.CameraInfo. –

+1

Сделайте добавление camera.release(); перед изменением идентификатора –

1

Вот мой окончательный код для камеры переключения назад/фронт, это работает для меня ..

public class MyCamera extends Activity implements SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback { 

    Camera mCamera; 
    SurfaceView mPreview; 
    String filePath ; 
    int currentCameraId = 0; 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.camera_preview); 
     mPreview = (SurfaceView)findViewById(R.id.preview); 
     mPreview.getHolder().addCallback(this); 
     mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mCamera = Camera.open(currentCameraId); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mCamera.stopPreview(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mCamera.release(); 
     Log.d("CAMERA","Destroy"); 
    } 

    public void onCancelClick(View v) { 

     mCamera.stopPreview(); 
     mCamera.release(); 
     if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
      currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
     } 
     else { 
      currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
     } 
     mCamera = Camera.open(currentCameraId); 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_FRONT, info); 
     int rotation = this.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: degrees = 0; break; //Natural orientation 
       case Surface.ROTATION_90: degrees = 90; break; //Landscape left 
       case Surface.ROTATION_180: degrees = 180; break;//Upside down 
       case Surface.ROTATION_270: degrees = 270; break;//Landscape right 
      } 
     int rotate = (info.orientation - degrees + 360) % 360; 

     //STEP #2: Set the 'rotation' parameter 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setRotation(rotate); 
      try { 
      mCamera.setPreviewDisplay(mPreview.getHolder()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.setParameters(params); 
     mCamera.setDisplayOrientation(90); 
     mCamera.startPreview(); 
    } 

    public void onSnapClick(View v) { 
     mCamera.takePicture(this, null, null, this); 
    } 

    @Override 
    public void onShutter() { 
     Toast.makeText(this, "Click!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     //Here, we chose internal storage 
     FileOutputStream fos = null; 
     try { 
      filePath = "/sdcard/test.jpg"; 
      fos = new FileOutputStream(
        filePath); 
      fos.write(data); 
      fos.close(); 
      //Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
     } finally { 
      Intent i = getIntent(); 
      i.putExtra("Path",filePath); 
      setResult(RESULT_OK, i); 
      finish(); 
     } 
     camera.startPreview(); 
    } 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info); 
     int rotation = this.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: degrees = 0; break; //Natural orientation 
       case Surface.ROTATION_90: degrees = 90; break; //Landscape left 
       case Surface.ROTATION_180: degrees = 180; break;//Upside down 
       case Surface.ROTATION_270: degrees = 270; break;//Landscape right 
      } 
     int rotate = (info.orientation - degrees + 360) % 360; 

     //STEP #2: Set the 'rotation' parameter 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setRotation(rotate); 
     mCamera.setParameters(params); 
     mCamera.setDisplayOrientation(90); 
     mCamera.startPreview(); 
    } 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mCamera.setPreviewDisplay(mPreview.getHolder()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.i("PREVIEW","surfaceDestroyed"); 
    } 
} 
+0

где кнопка для его переключения –

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

  • Нет связанных вопросов^_^