Android录音与播放,使用MediaRecorder录音 ,用MediaPlayer播放,按钮长按开始录音,松开结束录音,点击播放按钮开始播放。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_recording_filepath"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_recording"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/recorder_start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.082"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.167" />
<Button
android:id="@+id/btn_play_recording"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/recorder_stop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.928"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.167" />
</android.support.constraint.ConstraintLayout>
MainActivity.java
package com.cmcc.jason.music2;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
/**
* 录音按钮,长按开始录音,松开结束
*/
Button mBtnRecording;
/**
* 播放录音文件按钮
*/
Button mBtnPlayRecording;
private MediaRecorder mediaRecorder;
// 以文件的形式保存
private File recordFile;
private TextView mTVRecordingFilepath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTVRecordingFilepath = (TextView) findViewById(R.id.tv_recording_filepath);
mBtnRecording = (Button) findViewById(R.id.btn_recording);
mBtnPlayRecording = (Button) findViewById(R.id.btn_play_recording);
String sdCardStr = getSDPath();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
String currentTimeStr = df.format(new Date());// new Date()为获取当前系统时间
recordFile = new File(sdCardStr, currentTimeStr + ".amr");
mBtnRecording.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
//按住事件发生后执行代码的区域
startRecording();
Toast.makeText(MainActivity.this, "开始录音", Toast.LENGTH_SHORT).show();
break;
}
case MotionEvent.ACTION_UP: {
//松开事件发生后执行代码的区域
stopRecording();
Toast.makeText(MainActivity.this, "结束录音", Toast.LENGTH_SHORT).show();
mTVRecordingFilepath.setText(recordFile.getPath());
break;
}
default:
break;
}
return false;
}
});
mBtnPlayRecording.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 判断文件是否存在,如果存在,就播放
*/
if (fileIsExists(recordFile.getPath())) {
try {
FileInputStream fis = new FileInputStream(recordFile);
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
/**
* 判断文件是否存在
* @param strFile 文件路径
* @return 存在true,不存在false
*/
public boolean fileIsExists(String strFile) {
try {
File f = new File(strFile);
if (!f.exists()) {
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* 获取SD卡路径
* @return SD卡路径字符串格式
*/
public static String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
}
return sdDir.toString();
}
/**
* 开始录音
*/
private void startRecording() {
mediaRecorder = new MediaRecorder();
// 判断,若当前文件已存在,则删除
if (recordFile.exists()) {
recordFile.delete();
}
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setOutputFile(recordFile.getAbsolutePath());
try {
// 准备好开始录音
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 结束录音,释放
*/
private void stopRecording() {
if (recordFile != null) {
mediaRecorder.stop();
mediaRecorder.release();
}
}
}
最最重要的是,不要忘记权限!
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />