안드로이드 개발 질문/답변
(글 수 45,052)
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>



