package com.andbase.demo.activity; import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.media.MediaRecorder; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import com.andbase.demo.R; import com.andbase.library.app.camera.CameraManager; import com.andbase.library.app.camera.Config; import com.andbase.library.util.AbFileUtil; import java.io.File; import java.util.Random; public class RecoderCameraActivity extends Activity implements SurfaceHolder.Callback { /** UI相关. */ private SurfaceView surfaceView = null; /** 拍照按钮. */ private Button stopBtn; /** 控制相关. */ private boolean hasSurface = false; /** 录制. */ private MediaRecorder mRecorder; /** 录制的文件. */ private File videoFile; /** * 开始. * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //屏幕参数 int cameraId = this.getIntent().getIntExtra("cameraId", 0); int orientation = this.getIntent().getIntExtra("orientation", 0); Config.cameraId = cameraId; Config.orientation = orientation; //强制为横屏 if(Config.orientation==0){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }else{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } setContentView(R.layout.recoder_main); // 初始化 CameraManager CameraManager.init(getApplication()); surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = (SurfaceHolder)surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.setKeepScreenOn(true); //UI相关 stopBtn = (Button)this.findViewById(R.id.stop_btn); stopBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("path", videoFile.getPath()); setResult(RESULT_OK,intent); finish(); } }); } /** * 打开相机. * * @param surfaceHolder the surface holder */ private void initCamera(SurfaceHolder surfaceHolder) { try { CameraManager manager = CameraManager.get(); Log.e("initCamera", "initCamera 相机界面初始化:"+Config.cameraId); manager.openDriver(null,Config.cameraId); manager.startPreview(); startRecorder(); }catch (Exception e) { e.printStackTrace(); } } /** * surfaceChanged. * @param holder * @param format * @param width * @param height */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //Log.e("surfaceChanged", "surfaceChanged 相机界面改变"); } /** * surfaceCreated. * @param holder */ @Override public void surfaceCreated(SurfaceHolder holder) { if (!hasSurface) { initCamera(holder); hasSurface = true; } } /** * surfaceDestroyed. * @param holder */ @Override public void surfaceDestroyed(SurfaceHolder holder) { hasSurface = false; } /** * 暂停,将相机关闭. */ @Override protected void onPause() { stopRecorder(); CameraManager.get().stopPreview(); CameraManager.get().closeDriver(); Log.e("onPause", "onPause 相机界面暂停"); super.onPause(); } /** * 恢复. */ @Override protected void onResume() { //恢复相机 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); Log.e("hasSurface", "hasSurface:"+hasSurface); if (hasSurface) { //SurfaceView存在就重新打开相机 initCamera(surfaceHolder); } else { //SurfaceView不存在,重新设置surfaceHolder,同时SurfaceView会被重建 surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); CameraManager.get().startPreview(); startRecorder(); } //关键代码:恢复数据 Log.e("onResume", "onResume 相机界面恢复"); super.onResume(); } /** * 完成. */ @Override public void finish() { super.finish(); Log.e("finish", "finish 相机界面释放"); } public void startRecorder(){ try { // 创建保存录制视频的视频文件 String photoDir = AbFileUtil.getImageDownloadDir(RecoderCameraActivity.this); String fileName = "video_"+new Random().nextInt(1000) + "-" + System.currentTimeMillis() + ".mp4"; videoFile = new File(photoDir, fileName); try { if(videoFile.exists()){ videoFile.delete(); } if(!videoFile.getParentFile().exists()){ videoFile.getParentFile().mkdirs(); } if(!videoFile.exists()){ videoFile.createNewFile(); } } catch (Exception e) { e.printStackTrace(); } // 创建MediaPlayer对象 CameraManager.get().getCamera().unlock(); mRecorder = new MediaRecorder(); mRecorder.reset(); mRecorder.setCamera(CameraManager.get().getCamera()); // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER) mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置从摄像头采集图像 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置声音编码的格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置图像编码的格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mRecorder.setOutputFile(videoFile.getAbsolutePath()); // 指定使用SurfaceView来预览视频 mRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); mRecorder.prepare(); // 开始录制 mRecorder.start(); } catch (Exception e) { e.printStackTrace(); } } public void stopRecorder(){ try { if(mRecorder!=null){ // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; } } catch (Exception e) { e.printStackTrace(); } } /** * * 释放资源. */ @Override protected void onDestroy() { super.onDestroy(); } }