场景
在Android中怎样实现类似发送语音消息功能前的按键录音并将其显示在RecyclerView上并且能点击录音文件进行播放。
一、使用AudioRrecord录音
赋予录音权限
打开AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
封装录音相关工具类
public class PcmToWavUtil {
private int mBufferSize; //缓存的音频大小
private int mSampleRate = 44100;// 此处的值必须与录音时的采样率一致
private int mChannel = AudioFormat.CHANNEL_IN_STEREO; //立体声
private int mEncoding = AudioFormat.ENCODING_PCM_16BIT;
private static class SingleHolder {
static PcmToWavUtil mInstance = new PcmToWavUtil();
}
public static PcmToWavUtil getInstance() {
return SingleHolder.mInstance;
}
public PcmToWavUtil() {
this.mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannel, mEncoding);
}
/**
* @param sampleRate sample rate、采样率
* @param channel channel、声道
* @param encoding Audio data format、音频格式
*/
public PcmToWavUtil(int sampleRate, int channel, int encoding) {
this.mSampleRate = sampleRate;
this.mChannel = channel;
this.mEncoding = encoding;
this.mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannel, mEncoding);
}
/**
* pcm文件转wav文件
*
* @param inFilename 源文件路径
* @param outFilename 目标文件路径
* @param deleteOrg 是否删除源文件
*/
public void pcmToWav(String inFilename, String outFilename, boolean deleteOrg) {
FileInputStream in;
FileOutputStream out;
long totalAudioLen;
long totalDataLen;
long longSampleRate = mSampleRate;
int channels = 2;
long byteRate = 16 * mSampleRate * channels / 8;
byte[] data = new byte[mBufferSize];
try {
in = new FileInputStream(inFilename);
out = new FileOutputStream(outFilename);
totalAudioLen = in.getChannel().size();
totalDataLen = totalAudioLen + 36;
writeWaveFileHeader(out, totalAudioLen, totalDataLen,
longSampleRate, channels, by