package video.test;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;
public class VideoTest extends Activity implements SurfaceHolder.Callback {
 MediaRecorder  m_Recoder = null;
 Button    m_StartBtn, m_PlayBtn;
 boolean   m_IsStart = false;
 String   m_Path = "";
 
 String   tag = "info";
 
 private SurfaceView  m_Preview;
 private SurfaceHolder m_Holder;
 
 VideoView m_Video;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        m_Preview = (SurfaceView)findViewById(R.id.surface);
        
        m_Holder  = m_Preview.getHolder();
        m_Holder.addCallback(this);
        m_Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        m_Video  = (VideoView)findViewById(R.id.videoview);
        
        m_StartBtn  = (Button)findViewById(R.id.start);
        m_PlayBtn  = (Button)findViewById(R.id.play);
        
        m_StartBtn.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    m_Preview.setVisibility(View.VISIBLE);
    m_Video.setVisibility(View.INVISIBLE);
    
    if(m_IsStart == false)
    {
     String sd = Environment.getExternalStorageDirectory().getAbsolutePath();
     m_Path = sd + "/recvideo.mp4";
     
     if(m_Recoder == null) m_Recoder = new MediaRecorder();
     else m_Recoder.reset();
     
     m_Recoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
     m_Recoder.setAudioSource(MediaRecorder.AudioSource.MIC);
     
     m_Recoder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
     
     m_Recoder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
     m_Recoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
     
     m_Recoder.setVideoEncodingBitRate(16);
     m_Recoder.setVideoSize(320, 240);
     m_Recoder.setOutputFile(m_Path);
     m_Recoder.setPreviewDisplay(m_Holder.getSurface());
     try {
      m_Recoder.prepare();
      Log.i(tag, "m_Recoder.prepare() is done");
     } catch (IllegalStateException e) {
      Log.i(tag, "State error : " + e.getMessage());
      // TODO: handle exception
     } catch (IOException e) {
      // TODO: handle exception
      Log.i(tag, "IO error : " + e.getMessage());
     }
     
     m_Recoder.start();
     m_IsStart = true;
     m_StartBtn.setText("Stop");
    }
    else
    {
     m_Recoder.stop();
     m_Recoder.release();
     m_Recoder = null;
     m_IsStart = false;
     m_StartBtn.setText("Start");
    }
   }
  });
        
        m_PlayBtn.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    if(m_Path.length() == 0 || m_IsStart)
    {
     Toast.makeText(VideoTest.this, "녹화를 먼저 하십시오", 0).show();
     return;
    }
    
    m_Preview.setVisibility(View.INVISIBLE);
    m_Video.setVisibility(View.VISIBLE);
    m_Video.setVideoPath(m_Path);
    m_Video.start();
   }
  });
    }
    
 @Override
 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void surfaceCreated(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
 }
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  if(m_Recoder != null)
  {
   m_Recoder.release();
   m_Recoder = null;
  }
 }
}


갤럭시 S2에서 테스트를 해본 결과 IOExcept이 발생합니다.  try문에서 처음에는 Log 대신에 Toast를 사용하였습니다. 그런데 Toast가 뜨지 않고 한참 멈춰있다가 Sorry 메세지 나오기에 Log로 확인해본 결과 IOException Error가 발생하는 것을 확인했습니다. 그리고 매니페스트에 아래와 같이 권한을 주었습니다.

 

<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>