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设置为预览尺寸。
- /**
- * 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择)
- *
- * @param surfaceWidth
- * 需要被进行对比的原宽,surface view的宽度
- * @param surfaceHeight
- * 需要被进行对比的原高 surface view的高度
- * @param preSizeList 得到的支持预览尺寸的list,parmeters.getSupportedPreviewSizes()
- * 需要对比的预览尺寸列表
- * @return 得到与原宽高比例最接近的尺寸
- */
- protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,
- List<Size> preSizeList) {
- int ReqTmpWidth;
- int ReqTmpHeight;
- // 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
- if (mIsPortrait) {
- ReqTmpWidth = surfaceHeight;
- ReqTmpHeight = surfaceWidth;
- } else {
- ReqTmpWidth = surfaceWidth;
- ReqTmpHeight = surfaceHeight;
- }
- //先查找preview中是否存在与surfaceview相同宽高的尺寸
- for(Camera.Size size : preSizeList){
- if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){
- return size;
- }
- }
- // 得到与传入的宽高比最接近的size
- float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;
- float curRatio, deltaRatio;
- float deltaRatioMin = Float.MAX_VALUE;
- Camera.Size retSize = null;
- for (Camera.Size size : preSizeList) {
- curRatio = ((float) size.width) / size.height;
- deltaRatio = Math.abs(reqRatio - curRatio);
- if (deltaRatio < deltaRatioMin) {
- deltaRatioMin = deltaRatio;
- retSize = size;
- }
- }
- return retSize;
- }
/** * 初始化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); }
只解决了部分手机,有些手机还是不行
1.Activity实现implements Android.media.MediaRecorder.OnErrorListener这个接口
2.开始录制视频时
- if (mMediaRecorder == null) {
- mMediaRecorder = new MediaRecorder();
- mMediaRecorder.setOnErrorListener(this);
- } else {
- mMediaRecorder.reset();
- }
- mMediaRecorder.setOnErrorListener(null);
- mMediaRecorder.setPreviewDisplay(null);
- mMediaRecorder.stop();
- public void onError(MediaRecorder mr, int what, int extra) {
- // TODO Auto-generated method stub
- try {
- if (mr != null)
- mr.reset();
- } catch (Exception e) {
- }
- }