2013-05-20 3 views
2

Мне нужно повернуть экран камеры на угол 90, 180, 270, 360 в часах и против часовой стрелки для передней и задней камеры. Я применил блок кода на SurfaceView. Здесь я обеспечиваю код:Как повернуть экран камеры под любым углом в android?

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

    // Set camera preview size,orientation,rotation using parameters 
    if (camera != null) { 

     if (Build.VERSION.SDK_INT >= 8) { 

      android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 

      android.hardware.Camera.getCameraInfo(camId, info); 

      int rotation = getWindowManager().getDefaultDisplay() 
        .getRotation(); 
      int degrees = 0; 

      switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
      } 

      int result; 
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       result = (info.orientation + degrees) % 360; 
       result = (360 - result) % 360; // compensate the mirror 
      } else { // back-facing 
       result = (info.orientation - degrees + 360) % 360; 
      } 
      camera.setDisplayOrientation(result); 

     } 
     Camera.Parameters parameters = camera.getParameters(); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

} 

Если какая-либо один может сказать мне, как использовать встроенные функции камеры в моем приложении, то также приветствуется.

ответ

0

, прежде чем повернуть камеру, вы должны release это

первый

if(mCamera != null){ 
    mCamera.stopPreview(); 
    mCamera.release(); 
} 

Второй , если вы хотите изменить переднюю или заднюю камеру

try{ 
    mCamera = Camera.open(currentFacing); 
}catch(Exception e){ 
     e.printStackTrace(); 
} 

if (mCamera == null) { 
     mCamera = Camera.open(); 
    } 

последний

if(mCamera != null && mHolder.getSurface() != null){ 
     try{ 
      //here change the degress 
      mCamera.setDisplayOrientation(90); 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
+0

ее не работает – Tapesh

+0

, что проблема? не вращать или не менять камеру? – tesla1984

+0

Камера не вращается во всех 4 направлениях, а сохраненное изображение не является правильным. – Tapesh

0

Вы должны использовать Camera.setRotation для того, чтобы правильно захватить изображение, а не просто установить ориентацию дисплея для предварительного просмотра. Вы также должны обрабатывать переднюю и заднюю камеры по-разному. Следующий код должен заботиться о любой ориентации экрана, в том числе различной обработки для передней и задней камеры:

// Set camera rotation (consider display orientation) 
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
int displayOrientation = display.getRotation(); 

int rotation = cameraInfo.orientation; 
if (Surface.ROTATION_0 != displayOrientation) 
{ 
    if (CameraInfo.CAMERA_FACING_BACK == cameraInfo.facing) 
    { 
     if (Surface.ROTATION_90 == displayOrientation) 
     { 
      rotation -= 90; 
     } 
     else if (Surface.ROTATION_180 == displayOrientation) 
     { 
      rotation -= 180; 
     } 
     if (Surface.ROTATION_270 == displayOrientation) 
     { 
      rotation -= 270; 
     } 

     if (rotation < 0) 
     { 
      rotation += 360; 
     } 
    } 
    else 
    { 
     if (Surface.ROTATION_90 == displayOrientation) 
     { 
      rotation += 90; 
     } 
     else if (Surface.ROTATION_180 == displayOrientation) 
     { 
      rotation += 180; 
     } 
     if (Surface.ROTATION_270 == displayOrientation) 
     { 
      rotation += 270; 
     } 

     rotation %= 360; 
    } 
} 

Log.d(TAG, "Camera orientation (" + cameraInfo.orientation + ", " + displayOrientation + ", " + rotation + ")"); 

cameraParams.setRotation(rotation);