http://www.2cto.com/kf/201408/326131.html MediaRecorder类详解
遇到的坑:
- 如果想重复录音与播放,调用reset就可以了,不用释放资源(release)
- MediaPlayer如果没有调用reset时,如果重复播放,就会报错(Native Method))
- 与IOS交互过程的坑:使用AAC格式,IOS可以播放,但是ios录制的AAC格式默认进行了加密,我们这边无法做到即时播放,必须让IOS上传MP3格式我们才能体验好一些
- MediaPlayer播放网络音频效果也不错
public class RecordingActivity extends MVPBaseActivity<RecordingContract.View, RecordingPresenter> implements RecordingContract.View, View.OnTouchListener, MediaPlayer.OnCompletionListener {
private static final String TAG = "RecordingActivity";
@BindView(R.id.toolbar_title)
TextView mToolbarTitle;
@BindView(R.id.tv_tool_right)
TextView mTvToolRight;
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.tv_time)
TextView mTvTime;
@BindView(R.id.iv_play)
ImageView mIvPlay;
@BindView(R.id.iv_recording)
ImageView mIvRecording;
private int mTime;
private MediaRecorder mMediaRecorder;
private String mFile;
private MediaPlayer mMediaPlayer;
public static void start(Activity activity) {
activity.startActivity(new Intent(activity, RecordingActivity.class));
}
@Override
public int getLayoutId() {
return R.layout.activity_recording;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
initTitles();
initView();
}
private void initView() {
mIvPlay.setEnabled(false);
mIvRecording.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mIvRecording.setImageResource(R.drawable.recording_stop);
startRecording();
setTimer();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
mIvPlay.setEnabled(true);
mIvPlay.setImageResource(R.drawable.recording_play_start);
mIvRecording.setImageResource(R.drawable.recording_start);
stopRecording();
stopTime();
break;
}
return true;
}
@OnClick(R.id.iv_play)
public void onViewClicked() {
playRecording();
mIvPlay.setEnabled(false);
mIvPlay.setImageResource(R.drawable.recording_play_unenble);
}
private void stopRecording() {
try {
mMediaRecorder.stop();
mMediaRecorder.reset();
} catch (RuntimeException e) {
mMediaRecorder.reset();
}
}
private void startRecording() {
if (mMediaRecorder == null) {
mMediaRecorder = new MediaRecorder();
}
try {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setMaxDuration(30000);
mFile = FileUtils.getPath() + "/" + HttpUtils.getTimeStamp() + ".3gp";
mMediaRecorder.setOutputFile(mFile);
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IOException e) {
Log.e(TAG, "e=" + e.getMessage());
}
}
private void playRecording() {
try {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnCompletionListener(this);
}
mMediaPlayer.setDataSource(mFile);
mMediaPlayer.prepare();
mMediaPlayer.start();
setTimer();
} catch (IOException e) {
Log.e(TAG, "e=" + e.getMessage());
}
}
private void stopTime() {
mTvTime.removeCallbacks(mRunnable);
}
private void setTimer() {
mTvTime.setText("00");
mTime = 0;
mTvTime.postDelayed(mRunnable, 1000);
}
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mTvTime.setText(StringUtils.add(++mTime));
if (mTime == 30) {
mIvRecording.setImageResource(R.drawable.recording_start);
return;
}
mTvTime.postDelayed(this, 1000);
}
};
private void initTitles() {
mToolbar.setNavigationIcon(R.drawable.back);
mToolbarTitle.setText("语音录制");
mTvToolRight.setText("保存");
mTvToolRight.setTextColor(getResources().getColor(R.color.color_4990e2));
}
@Override
public void onCompletion(MediaPlayer mp) {
Log.e(TAG, "onCompletion");
mp.stop();
mp.reset();
mIvPlay.setEnabled(true);
mIvPlay.setImageResource(R.drawable.recording_play_start);
mTvTime.removeCallbacks(mRunnable);
}
@Override
protected void onDestroy() {
mTvTime.removeCallbacks(mRunnable);
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
if (mMediaRecorder != null) {
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
super.onDestroy();
}
}