http://developer.android.com/reference/android/media/MediaRecorder.htmlを参考に動画を撮るプログラムを作成してみた。なんとなくカメラを使う感覚でSurfaceViewやSurfaceHolder.Callbackを使ってみたが、これでいいのだろうか?とりあえず動画を撮ることができる。MediaRecorderのstartを呼び出してからstopが呼び出されるまでの間がsetOutputFileで指定したファイルに保存されるらしい。
実行するために以下のパーミッションが必要。カメラ用と録音用とファイル保存のため
android.permission.CAMERA android.permission.RECORD_AUDIO android.permission.WRITE_EXTERNAL_STORAGE
package test.video; import java.io.File; import android.os.Environment; import android.content.Context; import android.media.MediaRecorder; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class RecordView extends SurfaceView implements SurfaceHolder.Callback{ private MediaRecorder recorder; private boolean isRecord; public RecordView(Context context){ super(context); isRecord = false; SurfaceHolder holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { recorder.setOutputFile(createPath()); recorder.setVideoFrameRate(15); recorder.setVideoSize(width, height); recorder.setPreviewDisplay(holder.getSurface()); try{ //プレビュー開始 recorder.prepare(); }catch(Exception e){ android.util.Log.e("Error", e.getMessage()); } } public void surfaceDestroyed(SurfaceHolder holder) { } @Override public boolean onTouchEvent(MotionEvent event){ if(event.getAction() == MotionEvent.ACTION_DOWN){ if(!isRecord){ isRecord = true; //撮影開始 recorder.start(); }else{ recorder.stop(); recorder.release(); } } return true; } private String createPath(){ File dir = Environment.getExternalStorageDirectory(); File appDir = new File(dir, "VideoTest"); if(!appDir.exists()){ appDir.mkdir(); } String name = System.currentTimeMillis() + ".3gp"; return new File(appDir, name).getAbsolutePath(); } }