package dss.com.voicerecoeder;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by hu on 2017/4/9.
*/
public class FileRecordeActivity extends AppCompatActivity{
private Button startRecorde;
private TextView showTextREc;
private ExecutorService executorService;
private MediaRecorder mediaRecorder;
private File mAudioFile;
private long startRecTiem,stopRectime;
private Button playFileRec;
private volatile boolean isPlaying;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//单线程的线程池,用来后台录音
executorService = Executors.newSingleThreadExecutor();
setContentView(R.layout.activity_file_layout);
//开始录音的按钮
startRecorde = (Button) findViewById(R.id.btn_recorde);
//显示录音的时长
showTextREc = (TextView) findViewById(R.id.show_recorde);
//播放录音文件的按钮
playFileRec = (Button) findViewById(R.id.play_file_rec);
initListenter();
}
private void initListenter() {
//设置录音的监听,类似微信按住录音,松开停止录音
//这个时候点击事件就不适合,需要用到touch事件
startRecorde.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN: //按下开始录音
startRecorde();
break;
case MotionEvent.ACTION_CANCEL://抬起停止录音
case MotionEvent.ACTION_UP:
stopRecorde();
break;
}
return true;
}
});
playFileRec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//检查当前的状态
if (mAudioFile !=null && !isPlaying){
isPlaying = true;
//开始播放
executorService.submit(new Runnable() {
@Override
public void run() {
doPlay(mAudioFile);
}
});
}
}
});
}
//实际播放的逻辑
private void doPlay(File mAudioFile) {
//配置播放器
mediaPlayer = new MediaPlayer();
try{
//配置播放器
mediaPlayer.setDataSource(mAudioFile.getAbsolutePath());
//设置监听回调,播放失败,异常
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopPlay();
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
//提醒用户
playFaile();
//释放播放器
stopPlay();
return true;
}
});
mediaPlayer.setVolume(1,1);
mediaPlayer.setLooping(false); //循环
mediaPlayer.prepare();
mediaPlayer.start();
}catch (RuntimeException | IOException e){
playFaile();
stopPlay();
}
}
private void playFaile() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileRecordeActivity.this,"播放失败",Toast.LENGTH_SHORT).show();
}
});
}
//停止播放的逻辑
private void stopPlay() {
//重置播放状态
isPlaying = false;
//释放播放器
if(mediaPlayer != null){
mediaPlayer.setOnCompletionListener(null);
mediaPlayer.setOnErrorListener(null);
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer= null;
}
}
//开始录音
private void startRecorde() {
//更新ui界面
startRecorde.setText("正在说话。。");
startRecorde.setBackgroundColor(Color.parseColor("#c4c4c4"));
//录音是耗时的操作,在后台执行任务
executorService.submit(new Runnable() {
@Override
public void run() {
//释放资源
releaseRecorde();
//开始录音,dostart开始录音,返回值为boolean 判断录音是否成功
if (!dostart()){
recordeFail(); //显示录音失败
}
}
});
}
private boolean dostart() { //开始录音
//创建MediaRecorde
mediaRecorder = new MediaRecorder();
try {
//创建录音的文件
mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/midieRecorde/" +
System.currentTimeMillis() + ".m4a");
//确保文件的存在
mAudioFile.getParentFile().mkdirs();
mAudioFile.createNewFile();
//配置mediaRecorde
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//麦克风录音
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//MP4的格式
mediaRecorder.setAudioSamplingRate(44100);//采样的频率
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//通用的编码格式
mediaRecorder.setAudioEncodingBitRate(96000); //音质的频率
mediaRecorder.setOutputFile(mAudioFile.getAbsolutePath()); //文件路径
//开始录音
mediaRecorder.prepare();
mediaRecorder.start();
//记录开始录音的事件
startRecTiem = System.currentTimeMillis();
Log.e("------","录音成功了");
return true;
} catch (IOException | RuntimeException e1) {
//捕获异常,来提醒用户,避免崩溃
Log.e("------","录音失败dostart" + e1.toString());
return false;
}
}
private void recordeFail() { //录音失败
mAudioFile = null;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileRecordeActivity.this,"录音失败",Toast.LENGTH_SHORT).show();
}
});
}
private void releaseRecorde() { //释放资源
if (mediaRecorder!=null){
mediaRecorder.release();
mediaRecorder = null;
}
}
//停止录音
private void stopRecorde() {
startRecorde.setText("按住说话");
startRecorde.setBackgroundColor(Color.parseColor("#ffffff"));
executorService.submit(new Runnable() {
@Override
public void run() {
if (!doStope()){
recordeFail();
}
releaseRecorde();
}
});
}
private boolean doStope() {
stopRectime=System.currentTimeMillis();
try {
mediaRecorder.stop();
int second = (int) (stopRectime-startRecTiem)/1000;
if (second>3){
//更改UI
Log.e("------","录音成功了>3");
changedUI(second);
return true;
}else{
Log.e("------","录音失败了 《3");
return false;
}
}catch (RuntimeException e){
Log.e("------","录音失败了 《3" + e.toString());
return false;
}
}
private void changedUI(final int second) {
runOnUiThread(new Runnable() {
@Override
public void run() {
showTextREc.setText("录音"+ second + "秒钟");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//关闭任务,避免内存溢出
executorService.shutdownNow();
//释放资源
releaseRecorde();
//停止录音
stopPlay();
}
}
import android.graphics.Color;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by hu on 2017/4/9.
*/
public class FileRecordeActivity extends AppCompatActivity{
private Button startRecorde;
private TextView showTextREc;
private ExecutorService executorService;
private MediaRecorder mediaRecorder;
private File mAudioFile;
private long startRecTiem,stopRectime;
private Button playFileRec;
private volatile boolean isPlaying;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//单线程的线程池,用来后台录音
executorService = Executors.newSingleThreadExecutor();
setContentView(R.layout.activity_file_layout);
//开始录音的按钮
startRecorde = (Button) findViewById(R.id.btn_recorde);
//显示录音的时长
showTextREc = (TextView) findViewById(R.id.show_recorde);
//播放录音文件的按钮
playFileRec = (Button) findViewById(R.id.play_file_rec);
initListenter();
}
private void initListenter() {
//设置录音的监听,类似微信按住录音,松开停止录音
//这个时候点击事件就不适合,需要用到touch事件
startRecorde.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN: //按下开始录音
startRecorde();
break;
case MotionEvent.ACTION_CANCEL://抬起停止录音
case MotionEvent.ACTION_UP:
stopRecorde();
break;
}
return true;
}
});
playFileRec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//检查当前的状态
if (mAudioFile !=null && !isPlaying){
isPlaying = true;
//开始播放
executorService.submit(new Runnable() {
@Override
public void run() {
doPlay(mAudioFile);
}
});
}
}
});
}
//实际播放的逻辑
private void doPlay(File mAudioFile) {
//配置播放器
mediaPlayer = new MediaPlayer();
try{
//配置播放器
mediaPlayer.setDataSource(mAudioFile.getAbsolutePath());
//设置监听回调,播放失败,异常
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopPlay();
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
//提醒用户
playFaile();
//释放播放器
stopPlay();
return true;
}
});
mediaPlayer.setVolume(1,1);
mediaPlayer.setLooping(false); //循环
mediaPlayer.prepare();
mediaPlayer.start();
}catch (RuntimeException | IOException e){
playFaile();
stopPlay();
}
}
private void playFaile() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileRecordeActivity.this,"播放失败",Toast.LENGTH_SHORT).show();
}
});
}
//停止播放的逻辑
private void stopPlay() {
//重置播放状态
isPlaying = false;
//释放播放器
if(mediaPlayer != null){
mediaPlayer.setOnCompletionListener(null);
mediaPlayer.setOnErrorListener(null);
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer= null;
}
}
//开始录音
private void startRecorde() {
//更新ui界面
startRecorde.setText("正在说话。。");
startRecorde.setBackgroundColor(Color.parseColor("#c4c4c4"));
//录音是耗时的操作,在后台执行任务
executorService.submit(new Runnable() {
@Override
public void run() {
//释放资源
releaseRecorde();
//开始录音,dostart开始录音,返回值为boolean 判断录音是否成功
if (!dostart()){
recordeFail(); //显示录音失败
}
}
});
}
private boolean dostart() { //开始录音
//创建MediaRecorde
mediaRecorder = new MediaRecorder();
try {
//创建录音的文件
mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/midieRecorde/" +
System.currentTimeMillis() + ".m4a");
//确保文件的存在
mAudioFile.getParentFile().mkdirs();
mAudioFile.createNewFile();
//配置mediaRecorde
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//麦克风录音
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//MP4的格式
mediaRecorder.setAudioSamplingRate(44100);//采样的频率
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//通用的编码格式
mediaRecorder.setAudioEncodingBitRate(96000); //音质的频率
mediaRecorder.setOutputFile(mAudioFile.getAbsolutePath()); //文件路径
//开始录音
mediaRecorder.prepare();
mediaRecorder.start();
//记录开始录音的事件
startRecTiem = System.currentTimeMillis();
Log.e("------","录音成功了");
return true;
} catch (IOException | RuntimeException e1) {
//捕获异常,来提醒用户,避免崩溃
Log.e("------","录音失败dostart" + e1.toString());
return false;
}
}
private void recordeFail() { //录音失败
mAudioFile = null;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileRecordeActivity.this,"录音失败",Toast.LENGTH_SHORT).show();
}
});
}
private void releaseRecorde() { //释放资源
if (mediaRecorder!=null){
mediaRecorder.release();
mediaRecorder = null;
}
}
//停止录音
private void stopRecorde() {
startRecorde.setText("按住说话");
startRecorde.setBackgroundColor(Color.parseColor("#ffffff"));
executorService.submit(new Runnable() {
@Override
public void run() {
if (!doStope()){
recordeFail();
}
releaseRecorde();
}
});
}
private boolean doStope() {
stopRectime=System.currentTimeMillis();
try {
mediaRecorder.stop();
int second = (int) (stopRectime-startRecTiem)/1000;
if (second>3){
//更改UI
Log.e("------","录音成功了>3");
changedUI(second);
return true;
}else{
Log.e("------","录音失败了 《3");
return false;
}
}catch (RuntimeException e){
Log.e("------","录音失败了 《3" + e.toString());
return false;
}
}
private void changedUI(final int second) {
runOnUiThread(new Runnable() {
@Override
public void run() {
showTextREc.setText("录音"+ second + "秒钟");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//关闭任务,避免内存溢出
executorService.shutdownNow();
//释放资源
releaseRecorde();
//停止录音
stopPlay();
}
}