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设置为预览尺寸。
- 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;
- }
- for(Camera.Size size : preSizeList){
- if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){
- return 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);
}
2.MediaRecorder录制视频太短崩的问题
只解决了部分手机,有些手机还是不行
1.Activity实现implements Android.media.MediaRecorder.OnErrorListener这个接口
2.开始录制视频时
- if (mMediaRecorder == null) {
- mMediaRecorder = new MediaRecorder();
- mMediaRecorder.setOnErrorListener(this);
- } else {
- mMediaRecorder.reset();
- }
3.停止视频时
- mMediaRecorder.setOnErrorListener(null);
- mMediaRecorder.setPreviewDisplay(null);
- mMediaRecorder.stop();