首页 > 代码库 > http://blog.csdn.net/u010696783/article/details/51087191

http://blog.csdn.net/u010696783/article/details/51087191

1.预览照片被拉伸

通常,拍照预览页面的照片拉伸主要与下面两个因素有关  
            1.     Surfaceview的大小
           2.  Camera中的Preview的大小
如果surfaceview尺寸比例跟预览尺寸比例相同,那便不会产生变形,

那么问题就来了,怎么样才能够达到适配多台手机,界面不产生拉伸变形,而且程序又不崩溃?

思路如下:
1.     先将获取手机支持预览的尺寸列表通过方法parmeters.getSupportedPreviewSizes()来得到返回类型为List<Size>的值,
2.     先进行屏幕方向的一个判断,因为预览列表里面的尺寸都是w>h(即横屏),如果屏幕是竖屏则需要先将宽高进行调换,这样方便接下来的比较。
3.     先用for循环将预览尺寸列表每个元素宽高与surfaceview的宽高进行比较,如果存在宽高尺寸都与surfaceview宽高尺寸相同的size则将该宽高设置为预览尺寸。4.     如果步骤2找不到相同尺寸就得进行该步骤,将尺寸列表的宽高比例和surfaceview的比例作比较,找到一个相同或相近的。(一般来说,只要surfaceview的尺寸和屏幕尺寸相同,就可以找到相同的比例)然后将该尺寸的size设置为预览尺寸。

[java] view plain copy 技术分享技术分享
  1. /** 
  2. * 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择) 
  3. * @param surfaceWidth 
  4. * 需要被进行对比的原宽,surface view的宽度 
  5. * @param surfaceHeight 
  6. * 需要被进行对比的原高 surface view的高度 
  7. * @param preSizeList 得到的支持预览尺寸的list,parmeters.getSupportedPreviewSizes() 
  8. * 需要对比的预览尺寸列表 
  9. * @return 得到与原宽高比例最接近的尺寸 
  10. */  
[java] view plain copy 技术分享技术分享
  1. protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,  
  2.   
  3. List<Size> preSizeList) {  
  4. int ReqTmpWidth;  
  5. int ReqTmpHeight;  
  6. // 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高  
  7. if (mIsPortrait) {  
  8. ReqTmpWidth = surfaceHeight;  
  9. ReqTmpHeight = surfaceWidth;  
  10. else {  
  11. ReqTmpWidth = surfaceWidth;  
  12. ReqTmpHeight = surfaceHeight;  
  13. }  
  14. //先查找preview中是否存在与surfaceview相同宽高的尺寸  
  15. for(Camera.Size size : preSizeList){  
  16. if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){  
  17. return size;  
  18. }  
  19. }  
  20. // 得到与传入的宽高比最接近的size  
  21. float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;  
  22. float curRatio, deltaRatio;  
  23. float deltaRatioMin = Float.MAX_VALUE;  
  24. Camera.Size retSize = null;  
  25. for (Camera.Size size : preSizeList) {  
  26. curRatio = ((float) size.width) / size.height;  
  27. deltaRatio = Math.abs(reqRatio - curRatio);  
  28. if (deltaRatio < deltaRatioMin) {  
  29. deltaRatioMin = deltaRatio;  
  30. retSize = size;  
  31. }  
  32. }  
  33. return retSize;  
  34. }  

 

 

  /**
     * 初始化SurfaceView宽高比
* mWidth 视频录制宽度 mHeight 视频录制高度 ,让SurfaceView的宽高比跟录制视频的宽高比一直,防止视频被拉伸
*/ private void initSurfaceView() { final int w = DeviceUtils.getDisplayWidth(); int width = w; int height = (int) (w * ((mWidth*1.0f)/mHeight)); // LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mSurfaceView .getLayoutParams(); lp.width = width; lp.height = height; mSurfaceView.setLayoutParams(lp); }

 

 

 

2.MediaRecorder录制视频太短崩的问题

只解决了部分手机,有些手机还是不行

1.Activity实现implements   Android.media.MediaRecorder.OnErrorListener这个接口

2.开始录制视频时

[java] view plain copy 技术分享技术分享
  1. if (mMediaRecorder == null) {  
  2.                    mMediaRecorder = new MediaRecorder();  
  3.                    mMediaRecorder.setOnErrorListener(this);  
  4.                } else {  
  5.                    mMediaRecorder.reset();  
  6.                }  
3.停止视频时 
[java] view plain copy 技术分享技术分享
  1. mMediaRecorder.setOnErrorListener(null);  
  2.               mMediaRecorder.setPreviewDisplay(null);  
  3.                 mMediaRecorder.stop();  
技术分享技术分享
  1. public void onError(MediaRecorder mr, int what, int extra) {  
  2. // TODO Auto-generated method stub  
  3. try {  
  4.             if (mr != null)  
  5.                 mr.reset();  
  6.         } catch  (Exception e) {  
  7.         }  
  8. }  
 

http://blog.csdn.net/u010696783/article/details/51087191