2015-01-14 295 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

之前,在哪里按钮来切换它 –

相关问题