先给大家展示下效果图,如果大家感觉不错,请参考使用方法,
效果图如下所示:
使用方法:
录音工具类:AudioRecoderUtils.java,代码如下:
public class AudioRecoderUtils { //文件路径 private String filePath; //文件夹路径 private String FolderPath; private MediaRecorder mMediaRecorder; private final String TAG = "fan"; public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10; private OnAudioStatusUpdateListener audioStatusUpdateListener; /** * 文件存储默认sdcard/record */ public AudioRecoderUtils(){ //默认保存路径为/sdcard/record/下 this(Environment.getExternalStorageDirectory()+"/record/"); } public AudioRecoderUtils(String filePath) { file path = new file(filePath); if(!path.exists()) path.mkdirs(); this.FolderPath = filePath; } private long startTime; private long endTime; /** * 开始录音 使用amr格式 * 录音文件 * @return */ public voID startRecord() { // 开始录音 /* ①Initial:实例化MediaRecorder对象 */ if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); try { /* ②setAudioSource/setVedioSource */ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风 /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */ mMediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.DEFAulT); /* * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式 * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); filePath = FolderPath + TimeUtils.getCurrentTime() + ".amr" ; /* ③准备 */ mMediaRecorder.setoutputfile(filePath); mMediaRecorder.setMaxDuration(MAX_LENGTH); mMediaRecorder.prepare(); /* ④开始 */ mMediaRecorder.start(); // AudioRecord audioRecord. /* 获取开始时间* */ startTime = System.currentTimeMillis(); updateMicStatus(); Log.e("fan","startTime" + startTime); } catch (IllegalStateException e) { Log.i(TAG,"call startAmr(file mRecAudiofile) Failed!" + e.getMessage()); } catch (IOException e) { Log.i(TAG,"call startAmr(file mRecAudiofile) Failed!" + e.getMessage()); } } /** * 停止录音 */ public long stopRecord() { if (mMediaRecorder == null) return 0L; endTime = System.currentTimeMillis(); //有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈! try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; audioStatusUpdateListener.onStop(filePath); filePath = ""; }catch (RuntimeException e){ mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; file file = new file(filePath); if (file.exists()) file.delete(); filePath = ""; } return endTime - startTime; } /** * 取消录音 */ public voID cancelRecord(){ try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; }catch (RuntimeException e){ mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } file file = new file(filePath); if (file.exists()) file.delete(); filePath = ""; } private final Handler mHandler = new Handler(); private Runnable mUpdateMicStatusTimer = new Runnable() { public voID run() { updateMicStatus(); } }; private int BASE = 1; private int SPACE = 100;// 间隔取样时间 public voID setonAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) { this.audioStatusUpdateListener = audioStatusUpdateListener; } /** * 更新麦克状态 */ private voID updateMicStatus() { if (mMediaRecorder != null) { double ratio = (double)mMediaRecorder.getMaxAmplitude() / BASE; double db = 0;// 分贝 if (ratio > 1) { db = 20 * Math.log10(ratio); if(null != audioStatusUpdateListener) { audioStatusUpdateListener.onUpdate(db,System.currentTimeMillis()-startTime); } } mHandler.postDelayed(mUpdateMicStatusTimer,SPACE); } } public interface OnAudioStatusUpdateListener { /** * 录音中... * @param db 当前声音分贝 * @param time 录音时长 */ public voID onUpdate(double db,long time); /** * 停止录音 * @param filePath 保存路径 */ public voID onStop(String filePath); }}
使用很简单,主要就是开始录音startRecord()、取消录音cancelRecord()、结束录音stopRecord()和录音监听setonAudioStatusUpdateListener(),注意,取消录音不保存文件,结束录音会保存文件!
在布局文件中添加一个控件(任意一个都行)
<button androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:text="按住说话" androID:textcolor="@androID:color/white" androID:ID="@+ID/button" androID:background="@color/colorPrimary" />
在Activity中使用:
//当前布局文件的根layout final relativeLayout rl = (relativeLayout) findVIEwByID(R.ID.rl); mbutton = (button) findVIEwByID(R.ID.button); //PopupWindow的布局文件 final VIEw vIEw = VIEw.inflate(this,R.layout.layout_microphone,null); final PopupWindowFactory mPop = new PopupWindowFactory(this,vIEw); //PopupWindow布局文件里面的控件 mImageVIEw = (ImageVIEw) vIEw.findVIEwByID(R.ID.iv_recording_icon); mTextVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.tv_recording_time); mAudioRecoderUtils = new AudioRecoderUtils(); //录音回调 mAudioRecoderUtils.setonAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() { //录音中....db为声音分贝,time为录音时长 @OverrIDe public voID onUpdate(double db,long time) { //根据分贝值来设置录音时话筒图标的上下波动,下面有讲解 mImageVIEw.getDrawable().setLevel((int) (3000 + 6000 * db / 100)); mTextVIEw.setText(TimeUtils.long2String(time)); } //录音结束,filePath为保存路径 @OverrIDe public voID onStop(String filePath) { Toast.makeText(MainActivity.this,"录音保存在:" + filePath,Toast.LENGTH_SHORT).show(); mTextVIEw.setText(TimeUtils.long2String(0)); } }); //button的touch监听 mbutton.setontouchListener(new VIEw.OntouchListener() { @OverrIDe public boolean ontouch(VIEw v,MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: mPop.showAtLocation(rl,Gravity.CENTER,0); mbutton.setText("松开保存"); mAudioRecoderUtils.startRecord(); break; case MotionEvent.ACTION_UP: mAudioRecoderUtils.stopRecord(); //结束录音(保存录音文件)// mAudioRecoderUtils.cancelRecord(); //取消录音(不保存录音文件) mPop.dismiss(); mbutton.setText("按住说话"); break; } return true; } });
总结
以上所述是小编给大家介绍的AndroID实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
@H_301_39@您可能感兴趣的文章:Android实现录音功能实现实例(MediaRecorder)android语音即时通讯之录音、播放功能实现代码Android编程实现通话录音功能的方法利用libmp3lame实现在Android上录音MP3文件示例Android使用MediaRecorder实现录音及播放Android 实现电话来去自动录音的功能Android App调用MediaRecorder实现录音功能的实例Android应用开发:电话监听和录音代码示例Android音频录制MediaRecorder之简易的录音软件实现代码Android简单的利用MediaRecorder进行录音的实例代码 总结以上是内存溢出为你收集整理的Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)全部内容,希望文章能够帮你解决Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)