안드로이드 녹음 기능
앱 개발시 사용한 녹음 관련 코드들이다.
구글링해서 가져온 코드인데, 어디서 가져왔는지...출처가 기억나지 않는다.
//녹음 시작
private void startRec()
{
mCurRecTimeMs = 0;
mCurProgressTimeDisplay = 0;
mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test/";
// 파일명을 년도월일시간분초 로 생성 겹치는 상황 없애기
SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyyMMddHHmmss");
// 파일명 위에서 정한 파일명을 생성한 폴더에 저장
mFileName = "test" + timeStampFormat.format(new Date()).toString() + "Rec.mp4";
mPlayingFileName = mFileName.toString(); //play할 파일명 전달
Log.e("startRec", "mFileName ==========> " +mFilePath + mFileName);
// SeekBar의 상태를 0.1초후 체크 시작
mProgressHandler.sendEmptyMessageDelayed(0, 100);
if (mRecorder == null)
{
mRecorder = new MediaRecorder();
}
mRecorder.reset();
try
{
//오디오 파일 생성
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mRecorder.setOutputFile(mFilePath + mFileName);
mRecorder.prepare();
mRecorder.start();
}
catch(IllegalStateException e)
{
Toast.makeText(this, "IllegalStateException " +e.getMessage(), 1).show();
}
catch(IOException e)
{
Toast.makeText(this, "IOException " +e.getMessage(), 1).show();
}
}
//녹음 정지
private void stopRec()
{
mRecord.setSelected(false);
try
{
mRecorder.stop();
}
catch(Exception e)
{
}
finally
{
if(mRecorder != null)
{
mRecorder.release();
mRecorder = null;
}
}
mCurRecTimeMs = -999;
// SeekBar의 상태를 즉시 체크
// mProgressHandler.sendEmptyMessageDelayed(0, 0);
// Toast.makeText(this, "폴더에 저장되었습니다.", Toast.LENGTH_SHORT).show();
}
//MediaPlayer
private void initMediaPlayer(String fullFilePath)
{
// 미디어 플레이어 생성
if (mPlayer == null)
{
mPlayer = new MediaPlayer();
}
mPlayer.reset();
mPlayer.setOnCompletionListener(this);
Log.e(TAG, "fullFilepath : "+ fullFilePath);
try
{
mPlayer.setDataSource(fullFilePath);
mPlayer.prepare();
int point = mPlayer.getDuration();
// mProgressbar.setMax(point);
int maxMinPoint = point / 1000 / 60;
int maxSecPoint = (point / 1000) % 60;
int maxHourPoint = point / 1000 / 60 / 60;
String maxMinPointStr = "";
String maxSecPointStr = "";
String maxHourPointStr = "";
if (maxMinPoint < 10)
maxMinPointStr = "0" + maxMinPoint + ":";
else
maxMinPointStr = maxMinPoint + ":";
if (maxSecPoint < 10)
maxSecPointStr = "0" + maxSecPoint;
else
maxSecPointStr = String.valueOf(maxSecPoint);
if (maxHourPoint < 10)
maxHourPointStr = "0" + maxHourPoint + ":";
else
maxHourPointStr = maxHourPoint + ":";
mTotalTime = maxHourPointStr + maxMinPointStr + maxSecPointStr;
mRecordingTime.setText("00:00:00 / " + mTotalTime);
// mEndTime.setText(maxHourPointStr + maxMinPointStr + maxSecPointStr);
//
// mProgressbar.setProgress(0);
}
catch(Exception e)
{
Log.v("ProgressRecorder", "미디어 플레이어 Prepare Error ==========> " + e);
}
}
Handler mProgressHandler = new Handler()
{
public void handleMessage(Message msg)
{
mCurRecTimeMs = mCurRecTimeMs + 100;
mCurProgressTimeDisplay = mCurProgressTimeDisplay + 100;
if(nState == RECORDING_STATE)
{
// mProgressbar.setMax(300000);
Log.e("LoadProfile", "====== mCurRecTimeMs : "+mCurRecTimeMs + " mCurProgressTimeDisplay : "+mCurProgressTimeDisplay);
// 녹음시간이 음수이면 정지버튼을 눌러 정지시켰음을 의미하므로
// SeekBar는 그대로 정지시키고 레코더를 정지시킨다.
if (mCurRecTimeMs < 0)
{}
// 녹음시간이 아직 최대녹음제한시간보다 작으면 녹음중이라는 의미이므로
// SeekBar의 위치를 옮겨주고 0.1초 후에 다시 체크하도록 한다.
else// if (mCurRecTimeMs < 300000)
{
int maxMinPoint = mCurProgressTimeDisplay / 1000 / 60;
int maxSecPoint = (mCurProgressTimeDisplay / 1000) % 60;
int maxHourPoint = mCurProgressTimeDisplay / 1000 / 60 / 60;
String maxMinPointStr = "";
String maxSecPointStr = "";
String maxHourPointStr = "";
if (maxMinPoint < 10)
maxMinPointStr = "0" + maxMinPoint + ":";
else
maxMinPointStr = maxMinPoint + ":";
if (maxSecPoint < 10)
maxSecPointStr = "0" + maxSecPoint;
else
maxSecPointStr = String.valueOf(maxSecPoint);
if (maxHourPoint < 10)
maxHourPointStr = "0" + maxHourPoint + ":";
else
maxHourPointStr = maxHourPoint + ":";
mRecordingTime.setText(maxHourPointStr + maxMinPointStr + maxSecPointStr);
Log.e("LoadProfile", "mCurProgressTimeDisplay : "+mCurProgressTimeDisplay);
// mProgressbar.setProgress(mCurProgressTimeDisplay);
mProgressHandler.sendEmptyMessageDelayed(0, 100);
}
// 녹음시간이 최대 녹음제한 시간보다 크면 녹음을 정지 시킨다.
// else
// {
//
// stopRec();
// }
}
else if(nState == PLAYING_STATE)
{
if (mPlayer == null) return;
try
{
if (mPlayer.isPlaying())
{
int maxMinPoint = mCurProgressTimeDisplay / 1000 / 60;
int maxSecPoint = (mCurProgressTimeDisplay / 1000) % 60;
int maxHourPoint = mCurProgressTimeDisplay / 1000 / 60 / 60;
String maxMinPointStr = "";
String maxSecPointStr = "";
String maxHourPointStr = "";
if (maxMinPoint < 10)
maxMinPointStr = "0" + maxMinPoint + ":";
else
maxMinPointStr = maxMinPoint + ":";
if (maxSecPoint < 10)
maxSecPointStr = "0" + maxSecPoint;
else
maxSecPointStr = String.valueOf(maxSecPoint);
if (maxHourPoint < 10)
maxHourPointStr = "0" + maxHourPoint + ":";
else
maxHourPointStr = maxHourPoint + ":";
mRecordingTime.setText(maxHourPointStr + maxMinPointStr + maxSecPointStr + " / " + mTotalTime);
// mProgressbar.setProgress(mPlayer.getCurrentPosition());
mProgressHandler.sendEmptyMessageDelayed(0, 100);
}
}
catch (IllegalStateException e)
{}
catch (Exception e)
{}
}
}
};
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nState = NORMAL_STATE;
mRecordingTime.setText(mTotalTime +" / " + mTotalTime);
mPlay.setText("재생");
// 재생이 종료되면 즉시 SeekBar 메세지 핸들러를 호출한다.
mProgressHandler.sendEmptyMessageDelayed(0, 0);
mRecord.setEnabled(true);
mList.setEnabled(true);
}
'[미네르바's IT] > [미네르바's 안드로이드]' 카테고리의 다른 글
[안드로이드]TextView shadow 주기 (0) | 2015.03.31 |
---|---|
[안드로이드]ListAdapter 에 버튼 이벤트 처리 (0) | 2015.03.30 |
[안드로이드]PagerAdapter class (0) | 2015.03.26 |
[안드로이드]파일 속성, 읽기, 쓰기, 생성, 복사하기 (0) | 2015.03.18 |
[안드로이드]오디오 관련 팁 (0) | 2015.03.18 |