一、需求分析
代替了录音笔,可以方便人们记录一些声音内容。

二、功能描述
用户启动程序后,点击录音按键,进行录音并保存。

三、预设API
startRecord:开始录音
cancelRecord:取消录音
stopRecord:结束录音
setOnAudioStatusUpdateListener:录音监听

四、代码实现
录音工具类: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);}}
<Buttonandroid: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:

        //当前布局文件的根layoutfinal 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为录音时长@Overridepublic void onUpdate(double db, long time) {//根据分贝值来设置录音时话筒图标的上下波动,下面有讲解mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100));mTextView.setText(TimeUtils.long2String(time));}//录音结束,filePath为保存路径@Overridepublic 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() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:mPop.showAtLocation(rl,Gravity.CENTER,0,0);mButton.setText("松开保存");mAudioRecoderUtils.startRecord();break;case MotionEvent.ACTION_UP:mAudioRecoderUtils.stopRecord();        //结束录音(保存录音文件)
//                        mAudioRecoderUtils.cancelRecord();    //取消录音(不保存录音文件)mPop.dismiss();mButton.setText("按住说话");break;}return true;}});

四、总结分析
基本已实现了大部分功能

作者:陈语童
原文链接:https://blog.csdn.net/weixin_41402015/article/details/80716952

安卓移动软件开发:简易录音软件实现相关推荐

  1. windowsphone开发_APP软件开发用哪些软件比较好

    说到APP软件开发,大家能否联想到APP使用情况呢.我们在生活上离不开手机,现在时代发展越来越快,2020年处于短视频流量时代,像抖音等这些软件APP想必大家都听说过,这样的一款APP开发需要多长时间 ...

  2. 软件工程:浅谈人工智能软件开发与传统软件开发的区别

    题目:浅谈人工智能软件开发与传统软件开发的区别 摘要:人工智能的飞速发展带动着软件工程的发展,最终使得软件工程产生新的变革.因为人工智能特有的性质,因而导致了人工智能软件与传统软件的差异性.本文对比了 ...

  3. 怎样用计算机录制声音文件,电脑录音软件推荐,录音软件如何使用?

    原标题:电脑录音软件推荐,录音软件如何使用? 在电脑上录音是很常见的一个操作,但是很多人用的都是电脑系统自带的录音工具,效果并没有很好,那么都有哪些值得推荐使用的电脑录音软件呢?其实电脑上录音并不复杂 ...

  4. 恩施软件开发人员每月多少钱_恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资...

    恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资 首页 > 软件 > 恩施软件开发学习 作者:镀金池   发布时间:2017-11-22 18:54 因为cent ...

  5. 浅谈移动软件开发与电脑软件开发发展前景

    首先,先说下当下的情况,我国经济的高速发展对计算机软件行业需求越来越高,因此国家根据实际需求加大了对软件行业的各项投入,如资金.人力.物力.政策. 软件行业是国家重点鼓励和支持的行业,他的发展前景肯定 ...

  6. 软件开发丨关于软件重构的灵魂四问

    在软件工程学中重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 摘要 在本文中,您会了解到如下的内容: 先添加新 ...

  7. 在线教育软件开发 教育APP软件开发分析

    随着互联网的快速发展,教育机构也纷纷改变了发展模式,教育APP软件的开发大受欢迎,司科认为教育软件的开发不仅能让教学资源共享,更能促进教育行业的发展. 为什么教育类APP软件值得开发 1.使用教育AP ...

  8. linux 录音软件安装,ubuntu 录音软件audacity 安装和使用

    使用HTK过程中,第一步使用HSLab录音和标签功能时,提示找不到/dev/dsp.显然只有旧的内核才支持OSS声音架构.最新的ALSA是没法被HSLab使用的.怎么办呢?网上提供了一些解决方法,但都 ...

  9. 抢单软件开发原理_软件开发原理

    抢单软件开发原理 Rubbish software is produced when we try to do everything at once. 当我们尝试一次做所有事情时,就会产生垃圾软件. ...

  10. 汽车ECU软件开发之应用层软件与底层软件

    随着汽车产品日渐趋向电子化,人们对各类先进的安全系统.高级驾驶辅助系统的接受程度日益提升.而原本昂贵的盲点检测.自动紧急制动等功能的成本下滑,使其快速获得了市场青睐.富士奇美拉研究所(Fuji Chi ...

最新文章

  1. typora新增主题,typora将主题导入本地
  2. WOJ 1204 继续找相同
  3. 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的桌面,显示我的电脑图标
  4. linux红外键盘映射表,linux下修改键盘映射
  5. 前端设定项目奖金有多少_华为资深HR:年终奖不是一个合理的奖金制度
  6. pythonelectron桌面开发案例_electron vue桌面应用入门实例
  7. c++求n次方_课时9一元二次方程及其应用
  8. C语言嵌入式系统编程修炼之内存操作
  9. 白盒测试及其存在的一些问题
  10. java中的jackson_Java中的JSON数据绑定框架Jackson使用介绍
  11. 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]
  12. JSP转译成Servlet详细过程
  13. LINQ的数据库查询应用(zhuan)
  14. Atitit 朋友圈 微博 之道 朋友圈的dos and donts
  15. atitit.MyEclipse10 中增加svn插件故障排除
  16. 中国省份城市列表(汉字+拼音)
  17. 每月物品消耗统计表_预算统计表- .doc
  18. html怎么截取部分图片,【原创】详解css用坐标来截取部分图片
  19. 三倍快乐!推荐跨Win/Mac/Linux平台免费优质软件
  20. 【电子设计大赛】2017 年全国大学生电子设计竞赛 仪器和主要元器件清单

热门文章

  1. 浙江大学计算机博士很难复试专业课,浙江大学考博英语复试经验参考
  2. 达人评测 i7 1260p和i7 1255u选哪个
  3. 软件工程(一)——软件开发模型和方法
  4. 中华英才网裁员,五成员工可拿(N+3)*月薪的离职补偿
  5. python短信验证码 容联云
  6. MySQL:设置初始密码
  7. Hive实现时间滑动窗口计算
  8. 分析java程序在运行中卡顿
  9. x509数字证书详解
  10. 内地人去香港旅游注意事项