繼承 LinearLayout 組合 SurfaceView + ProgressBar,封裝 Camera 預覽與 MediaRecorder 錄製,支持屬性配置(分辨率、最長時長、是否自動開啟攝像頭),提供錄製完成回調。
movie_recorder_view.xml 垂直佈局,SurfaceView 佔比 1,ProgressBar 固定 2dp 底部attrs.xml 定義 width/height/is_open_camera/record_max_timeMovieRecorderView 管理 Camera/Recorder 生命週期、計時器、文件存儲initCamera() 開啟攝像頭、設置豎屏參數、綁定預覽、unlock() 供 MediaRecorder 使用createRecordDir() 創建臨時 mp4 文件 → initRecord() 配置 MediaRecorder(視頻源 CAMERA、音頻源 MIC、MPEG_4、分辨率、幀率、碼率、90° 旋轉) → start() → 定時器每秒更新進度條stopRecord() 停止錄製 → releaseRecord() 釋放 MediaRecorder → freeCameraResource() 鎖定並釋放 Camera → 回調 OnRecordFinishListener// 攝像頭豎屏設置
params.set("orientation", "portrait");
camera.setParameters(params);
camera.setDisplayOrientation(90);
// MediaRecorder 關鍵配置
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoSize(width, height);
recorder.setVideoEncodingBitRate(512 * 1024); // 512kbps
recorder.setOrientationHint(90); // 輸出旋轉 90° 保證豎屏播放
SURFACE_TYPE_PUSH_BUFFERS 兼容舊版本setOnErrorListener 捕獲錄製錯誤,stop() 包裹多重 try-catch 防崩潰File.createTempFile("recording", ".mp4", dir) 避免命名衝突CAMERA、RECORD_AUDIO、WRITE_EXTERNAL_STORAGEMediaRecorder + Camera2 或 CameraX 適配