private ImageButton record = null,stop = null;
private TextView info = null;
private MediaRecorder mediaRecorder = null;
private String recordVideoSaveFileName = null;
private boolean isRecord = false, hasProblem = false;
private SurfaceView surface = null;
private int width, height;
private Camera camera;
private FrameLayout preview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示
setContentView(R.layout.media_recorder);
recordVideoSaveFileName = getIntent().getStringExtra("file_path");
camera = null;
try {
camera = Camera.open(0);
} catch (Exception e) {
Log.e("MediaRecorderActivity", e.toString());
if (camera != null) {
camera.release();
}
hasProblem = true;
}
//增加预览功能
CameraPreview mPreview = new CameraPreview(this, camera);
preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
if (camera != null) {
Display display = getWindowManager().getDefaultDisplay();
Camera.Parameters parameters = camera.getParameters();
Camera.Size cs = getBestPreviewSize(display.getWidth(), display.getHeight(), parameters);
width = cs.width;
height = cs.height;
setCameraDisplayOrientation(0); //设置摄像头的角度
}
record = (ImageButton) findViewById(R.id.record);
stop = (ImageButton) findViewById(R.id.stop);
info = (TextView) findViewById(R.id.video_info);
surface = (SurfaceView) findViewById(R.id.surface);
surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surface.getHolder().setFixedSize(480, 800);
record.setOnClickListener(new RecordOnClickListenerImpl());
stop.setOnClickListener(new StopOnClickListenerImpl());
stop.setEnabled(false); // 停止录象的按钮暂时不可用
}
private class RecordOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
releaseCamera();
preview.removeAllViews();
if (CommonTool.existSDcard()) { // sd卡存在
mediaRecorder = new MediaRecorder();
// camera.unlock();
// mediaRecorder.reset(); // 重置
// mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).fileFormat);
mediaRecorder.setVideoEncodingBitRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoBitRate);
mediaRecorder.setVideoFrameRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoFrameRate);
mediaRecorder.setVideoEncoder(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoCodec);
mediaRecorder.setAudioEncodingBitRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioBitRate);
mediaRecorder.setAudioSamplingRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioSampleRate);
mediaRecorder.setAudioEncoder(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioCodec);
mediaRecorder.setOutputFile(recordVideoSaveFileName);
mediaRecorder.setVideoSize(width, height);
mediaRecorder.setOrientationHint(getRightOrientation(0));
mediaRecorder.setPreviewDisplay(surface.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch (Exception e) {
Log.e("MediaRecorderActivity", e.toString());
releaseMediaRecorder();
hasProblem = true;
}
if (!hasProblem){
mediaRecorder.start();
info.setText("正在录象中...");
stop.setEnabled(true);
record.setEnabled(false);
isRecord = true;
}
}
}
}
private class StopOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (isRecord) {
mediaRecorder.stop(); // stop the recording
releaseMediaRecorder(); // release the MediaRecorder object
releaseCamera();
stop.setEnabled(false);
record.setEnabled(true);
CommonToast.showToast(MediaRecorderActivity.this, "录象结束,文件路径为:" + recordVideoSaveFileName, Toast.LENGTH_SHORT).show();
// 设置结果,并进行传送
MediaRecorderActivity.this.setResult(RESULT_OK);
finish();
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder(); // if you are using MediaRecorder, release it first
releaseCamera(); // release the camera immediately on pause event
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
super.finish();
setResult(RESULT_CANCELED);
}
return false;
}
private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;
if (newArea > resultArea) {
result = size;
}
}
}
}
return (result);
}
//判断当前摄像头的角度
private void setCameraDisplayOrientation(int cameraId) {
camera.setDisplayOrientation(getRightOrientation(cameraId));
}
private int getRightOrientation(int cameraId){
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
return result;
}
private void releaseMediaRecorder(){
if (mediaRecorder != null) {
mediaRecorder.reset(); // clear recorder configuration
mediaRecorder.release(); // release the recorder object
mediaRecorder = null;
// camera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (camera != null){
camera.release(); // release the camera for other applications
camera = null;
}
}
}
这是我在网上搜集资料,并查阅stackoverflow 相关网站得到的录像activity,传递一个保存的路径即可,有预览功能,但是目前只支持横屏,如果是竖屏,录像的时候预览图角度会有偏差,也是根据手机而异。
其中getRightOrientation这个函数是根据当前屏幕横竖屏来获得最佳的camera预览角度,不会因某些摄像头默认的角度不同而不同(某些摄像头会自动转90度),由谷歌官网提供,很好用。
getBestPreviewSize 这个函数是根据不同分辨率的手机选择最合适的camera录像分辨率,mediaRecorder.setVideoSize(width, height);这个函数如果设置的参数不被设备支持就容易报错,类似mediaRecorder start失败,所以这个函数的功能就是找出最合适的大小,从stackoverflow上获得。
CommonTool.existSDcard() 这个方法是判断sd卡是否存在。
具体实现: //判断SD卡是否存在
public static boolean existSDcard() {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}