= null && running) { ? ? ? ? ? ? ? ? ? ? // 如果用户仍在录音 ? ? ? ? ? ? ? ? ? ? int volumn = mAudioUtil.getVolumn(); ? ? ? ? ? ? ? ? ? ? if (volumn != 0) ? ? ? ? ? ? ? ? ? ? ? ? mVolumeHandler.sendEmptyMessage(volumn); ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? exit(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? private final OnDismissListener onDismiss = new OnDismissListener() { ? ? ? ? @Override ? ? ? ? public void onDismiss(DialogInterface dialog) { ? ? ? ? ? ? stopRecording(); ? ? ? ? } ? ? }; ? ? static class ShowVolumeHandler extends Handler { ? ? ? ? private final WeakReference mOuterInstance; ? ? ? ? public ShowVolumeHandler(RecordButton outer) { ? ? ? ? ? ? mOuterInstance = new WeakReference(outer); ? ? ? ? } ? ? ? ? @Override ? ? ? ? public void handleMessage(Message msg) { ? ? ? ? ? ? RecordButton outerButton = mOuterInstance.get(); ? ? ? ? ? ? if (msg.what != -1) { ? ? ? ? ? ? ? ? // 大于0时 表示当前录音的音量 ? ? ? ? ? ? ? ? if (outerButton.mVolumeListener != null) { ? ? ? ? ? ? ? ? ? ? outerButton.mVolumeListener.onVolumeChange(mRecordDialog, ? ? ? ? ? ? ? ? ? ? ? ? ? ? msg.what); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? // -1 时表示录音超时 ? ? ? ? ? ? ? ? outerButton.finishRecord(); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? ? /** 音量改变的监听器 */ ? ? public interface OnVolumeChangeListener { ? ? ? ? void onVolumeChange(Dialog dialog, int volume); ? ? } ? ? public interface OnFinishedRecordListener { ? ? ? ? /** 用户手动取消 */ ? ? ? ? public void onCancleRecord(); ? ? ? ? /** 录音完成 */ ? ? ? ? public void onFinishedRecord(String audioPath, int recordTime); ? ? } }
?
/** ?* {@link #RecordButton}需要的工具类 ?* ?* @author kymjs(kymjs123@gmail.com) ?*/ public class RecordButtonUtil { ? ? public static final String AUDOI_DIR = Environment ? ? ? ? ? ? .getExternalStorageDirectory().getAbsolutePath() + "/oschina/audio"; // 录音音频保存根路径 ? ? ? private String mAudioPath; // 要播放的声音的路径 ? ? private boolean mIsRecording;// 是否正在录音 ? ? private boolean mIsPlaying;// 是否正在播放 ? ? private OnPlayListener listener; ? ? ? // 初始化 录音器 ? ? private void initRecorder() { ? ? ? ? mRecorder = new MediaRecorder(); ? ? ? ? mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); ? ? ? ? mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); ? ? ? ? mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); ? ? ? ? mRecorder.setOutputFile(mAudioPath); ? ? ? ? mIsRecording = true; ? ? } ? ? ? /** 开始录音,并保存到文件中 */ ? ? public void recordAudio() { ? ? ? ? initRecorder(); ? ? ? ? try { ? ? ? ? ? ? mRecorder.prepare(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? mRecorder.start(); ? ? } ? ? ? /** 获取音量值,只是针对录音音量 */ ? ? public int getVolumn() { ? ? ? ? int volumn = 0; ? ? ? ? // 录音 ? ? ? ? if (mRecorder != null && mIsRecording) { ? ? ? ? ? ? volumn = mRecorder.getMaxAmplitude(); ? ? ? ? ? ? if (volumn != 0) ? ? ? ? ? ? ? ? volumn = (int) (10 * Math.log(volumn) / Math.log(10)) / 7; ? ? ? ? } ? ? ? ? return volumn; ? ? } ? ? ? /** 停止录音 */ ? ? public void stopRecord() { ? ? ? ? if (mRecorder != null) { ? ? ? ? ? ? mRecorder.stop(); ? ? ? ? ? ? mRecorder.release(); ? ? ? ? ? ? mRecorder = null; ? ? ? ? ? ? mIsRecording = false; ? ? ? ? } ? ? } ? ? ? public void startPlay(String audioPath) { ? ? ? ? if (!mIsPlaying) { ? ? ? ? ? ? if (!StringUtils.isEmpty(audioPath)) { ? ? ? ? ? ? ? ? mPlayer = new MediaPlayer(); ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? mPlayer.setDataSource(audioPath); ? ? ? ? ? ? ? ? ? ? mPlayer.prepare(); ? ? ? ? ? ? ? ? ? ? mPlayer.start(); ? ? ? ? ? ? ? ? ? ? if (listener != null) { ? ? ? ? ? ? ? ? ? ? ? ? listener.starPlay(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? mIsPlaying = true; ? ? ? ? ? ? ? ? ? ? mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { ? ? ? ? ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? ? ? ? ? public void onCompletion(MediaPlayer mp) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ( |