提要:需求是开发类似微信发语音的功能,没有语音转文字。网上看了一些代码,不能拿来直接用,部分代码逻辑有问题,所以想把自己的代码贴出来,仅供参考。
功能:
a、设置最大录音时长和录音倒计时(为了方便测试,最大时长设置为15秒,开始倒计时设置为7秒)
b、在录音之前检查录音和存储权限
源码:
1、录音对话框管理类DialogManager:
/**
* 功能:录音对话框管理类
*/
public class DialogManager {
private AlertDialog.Builder builder;
private AlertDialog dialog;
private ImageView mIcon;
private ImageView mVoice;
private TextView mLabel;
private Context context;
/**
* 构造方法
*
* @param context Activity级别的Context
*/
public DialogManager(Context context) {
this.context = context;
}
/**
* 显示录音的对话框
*/
public void showRecordingDialog() {
builder = new AlertDialog.Builder(context, R.style.AudioRecorderDialogStyle);
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.audio_recorder_dialog, null);
mIcon = view.findViewById(R.id.iv_dialog_icon);
mVoice = view.findViewById(R.id.iv_dialog_voice);
mLabel = view.findViewById(R.id.tv_dialog_label);
builder.setView(view);
dialog = builder.create();
dialog.show();
dialog.setCanceledOnTouchOutside(false);
}
/**
* 正在播放时的状态
*/
public void recording() {
if (dialog != null && dialog.isShowing()) { //显示状态
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.VISIBLE);
mLabel.setVisibility(View.VISIBLE);
mIcon.setImageResource(R.drawable.ic_audio_recorder);
mVoice.setImageResource(R.drawable.ic_audio_v1);
mLabel.setText(R.string.audio_record_dialog_up_to_cancel);
}
}
/**
* 显示想取消的对话框
*/
public void wantToCancel() {
if (dialog != null && dialog.isShowing()) { //显示状态
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.GONE);
mLabel.setVisibility(View.VISIBLE);
mIcon.setImageResource(R.drawable.ic_audio_cancel);
mLabel.setText(R.string.audio_record_dialog_release_to_cancel);
}
}
/**
* 显示时间过短的对话框
*/
public void tooShort() {
if (dialog != null && dialog.isShowing()) { //显示状态
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.GONE);
mLabel.setVisibility(View.VISIBLE);
mLabel.setText(R.string.audio_record_dialog_too_short);
}
}
// 显示取消的对话框
public void dismissDialog() {
if (dialog != null && dialog.isShowing()) { //显示状态
dialog.dismiss();
dialog = null;
}
}
/**
* 显示更新音量级别的对话框
*
* @param level 1-7
*/
public void updateVoiceLevel(int level) {
if (dialog != null && dialog.isShowing()) { //显示状态
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.VISIBLE);
mLabel.setVisibility(View.VISIBLE);
int resId = context.getResources().getIdentifier("ic_audio_v" + level, "drawable", context.getPackageName());
mVoice.setImageResource(resId);
}
}
public void updateTime(int time) {
if (dialog != null && dialog.isShowing()) { //显示状态
mIcon.setVisibility(View.VISIBLE);
mVoice.setVisibility(View.VISIBLE);
mLabel.setVisibility(View.VISIBLE);
mLabel.setText(time + "s");