Advertisement
Guest User

Camerapreview

a guest
Mar 11th, 2014
1,360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.93 KB | None | 0 0
  1. public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  2.  
  3. static final String TAG = "CameraPreview";
  4. private static final int PICTURE_SIZE_MAX_WIDTH = 640/*1280*/;
  5. private static final int PREVIEW_SIZE_MAX_WIDTH = 640;
  6. public static final double ASPECT_RATIO = (double)10.0 / 9.0;
  7.  
  8. protected Activity mActivity;
  9. protected SurfaceHolder mHolder;
  10. protected Camera mCamera;
  11. protected Camera.Size mPreviewSize;
  12. protected Camera.Size mPictureSize;
  13. protected int mCameraId;
  14. private int mCameraCount;
  15.  
  16.  
  17.  
  18. public CameraPreview(Context context) {
  19. super(context);
  20. init();
  21. }
  22.  
  23. @SuppressWarnings("deprecation")
  24. private void init(){
  25. mActivity = (Activity) getContext();
  26.  
  27. mHolder = getHolder();
  28. setKeepScreenOn(true);
  29. mHolder.addCallback(this);
  30.  
  31. if(TlDevice.getSDKVersion() < VERSION_CODES.HONEYCOMB){
  32. mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  33. }
  34.  
  35. mCameraId = 0;
  36.  
  37. if (TlDevice.getSDKVersion() >= Build.VERSION_CODES.GINGERBREAD) {
  38. mCamera = Camera.open(mCameraId);
  39. } else {
  40. mCamera = Camera.open();
  41. }
  42.  
  43. mCameraCount = Camera.getNumberOfCameras();
  44. mPreviewSize = determineBestPreviewSize(mCamera.getParameters());
  45.  
  46. }
  47.  
  48. @Override
  49. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  50. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  51. int width = getMeasuredWidth();
  52. int height = (int) (width * ASPECT_RATIO);
  53. setMeasuredDimension(width, height);
  54. }
  55.  
  56.  
  57. @Override
  58. public void surfaceCreated(SurfaceHolder holder) {
  59. initCameraPreiview();
  60. }
  61.  
  62. private void initCameraPreiview(){
  63. try {
  64. Camera.Parameters params = mCamera.getParameters();
  65. Camera.Size previewSize = determineBestPreviewSize(params);
  66. Camera.Size pictureSize = determineBestPictureSize(params);
  67.  
  68. params.setPreviewSize(previewSize.width, previewSize.height);
  69. params.setPictureSize(pictureSize.width, pictureSize.height);
  70.  
  71. setFocustModes(params);
  72.  
  73. configureCameraParameters(params, true);
  74.  
  75. mCamera.setParameters(params);
  76. mCamera.setPreviewDisplay(mHolder);
  77. mCamera.startPreview();
  78. } catch (IOException e) {
  79. mCamera.release();
  80. mCamera = null;
  81. }
  82. }
  83.  
  84. private void setFocustModes(Camera.Parameters params){
  85. try {
  86.  
  87. List<String> focusModes = params.getSupportedFocusModes();
  88. if(focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){
  89. params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
  90. }
  91. } catch (Exception e) {
  92. PrintLog.debug("CameraPreview","Error on focus mode set>"+ e);
  93. }
  94. }
  95.  
  96.  
  97. @Override
  98. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  99. doSurfaceChanged(width, height);
  100. }
  101.  
  102. private void doSurfaceChanged(int width, int height) {
  103. if (mHolder.getSurface() == null){
  104. return;
  105. }
  106. mCamera.stopPreview();
  107.  
  108. Camera.Parameters cameraParams = mCamera.getParameters();
  109. boolean portrait = isPortrait();
  110.  
  111. Camera.Size previewSize = determineBestPreviewSize(cameraParams);
  112. Camera.Size pictureSize = determineBestPictureSize(cameraParams);
  113. mPreviewSize = previewSize;
  114. mPictureSize = pictureSize;
  115. configureCameraParameters(cameraParams, portrait);
  116.  
  117. try {
  118. mCamera.startPreview();
  119. } catch (Exception e) {
  120. }
  121. }
  122.  
  123. public void changeCamera(){
  124. if(mCameraCount > 1){
  125. mCameraId = (mCameraId == 0? 1 : 0);
  126. stop();
  127. mCamera = Camera.open(mCameraId);
  128. initCameraPreiview();
  129. }
  130. }
  131.  
  132. private Size determineBestPreviewSize(Camera.Parameters parameters) {
  133. if(mPreviewSize != null){
  134. return mPreviewSize;
  135. }
  136.  
  137. List<Size> sizes = parameters.getSupportedPreviewSizes();
  138. Camera.Size size = determineBestSize(sizes, PREVIEW_SIZE_MAX_WIDTH);
  139. mPreviewSize = size;
  140. return size;
  141. }
  142.  
  143. private Size determineBestPictureSize(Camera.Parameters parameters) {
  144. if(mPictureSize != null){
  145. return mPictureSize;
  146. }
  147.  
  148. List<Size> sizes = parameters.getSupportedPictureSizes();
  149. Camera.Size size = determineBestSize(sizes, PICTURE_SIZE_MAX_WIDTH);
  150. mPictureSize = size;
  151. return size;
  152. }
  153.  
  154. protected Size determineBestSize(List<Size> sizes, int maxWidth){
  155. Size bestSize = null;
  156. float MIN = Float.MAX_VALUE;
  157.  
  158. for (Size currentSize : sizes) {
  159. float scale = (float)currentSize.width / (float)currentSize.height;
  160. if(scale < MIN && currentSize.width <= maxWidth && currentSize.width > 352){
  161. MIN = scale;
  162. bestSize = currentSize;
  163. }
  164. }
  165.  
  166. if(bestSize == null){
  167. bestSize = sizes.get(sizes.size() - 1);
  168. }
  169. return bestSize;
  170. }
  171.  
  172.  
  173. private void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) {
  174.  
  175. android.hardware.Camera.CameraInfo info =
  176. new android.hardware.Camera.CameraInfo();
  177. android.hardware.Camera.getCameraInfo(mCameraId, info);
  178. int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
  179. int degrees = 0;
  180.  
  181. switch (rotation) {
  182. case Surface.ROTATION_0: degrees = 0; break;
  183. case Surface.ROTATION_90: degrees = 90; break;
  184. case Surface.ROTATION_180: degrees = 180; break;
  185. case Surface.ROTATION_270: degrees = 270; break;
  186. }
  187.  
  188. int result;
  189.  
  190.  
  191. if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  192. result = (info.orientation + degrees) % 360;
  193. result = (360 - result) % 360; // compensate the mirror
  194. } else { // back-facing
  195. result = (info.orientation - degrees + 360) % 360;
  196. }
  197.  
  198.  
  199. mCamera.setDisplayOrientation(result);
  200.  
  201. mCamera.setParameters(cameraParams);
  202. }
  203.  
  204. @Override
  205. public void surfaceDestroyed(SurfaceHolder holder) {
  206. stop();
  207. }
  208.  
  209. public void stop() {
  210. if (null == mCamera) {
  211. return;
  212. }
  213. mCamera.stopPreview();
  214. mCamera.release();
  215. mCamera = null;
  216. }
  217.  
  218. public boolean isPortrait() {
  219. return (mActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
  220. }
  221.  
  222. public Camera.Size getPreviewSize() {
  223. return mPreviewSize;
  224. }
  225.  
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement