安卓移动软件开发:简易录音软件实现
一、需求分析
代替了录音笔,可以方便人们记录一些声音内容。
二、功能描述
用户启动程序后,点击录音按键,进行录音并保存。
三、预设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
安卓移动软件开发:简易录音软件实现相关推荐
- windowsphone开发_APP软件开发用哪些软件比较好
说到APP软件开发,大家能否联想到APP使用情况呢.我们在生活上离不开手机,现在时代发展越来越快,2020年处于短视频流量时代,像抖音等这些软件APP想必大家都听说过,这样的一款APP开发需要多长时间 ...
- 软件工程:浅谈人工智能软件开发与传统软件开发的区别
题目:浅谈人工智能软件开发与传统软件开发的区别 摘要:人工智能的飞速发展带动着软件工程的发展,最终使得软件工程产生新的变革.因为人工智能特有的性质,因而导致了人工智能软件与传统软件的差异性.本文对比了 ...
- 怎样用计算机录制声音文件,电脑录音软件推荐,录音软件如何使用?
原标题:电脑录音软件推荐,录音软件如何使用? 在电脑上录音是很常见的一个操作,但是很多人用的都是电脑系统自带的录音工具,效果并没有很好,那么都有哪些值得推荐使用的电脑录音软件呢?其实电脑上录音并不复杂 ...
- 恩施软件开发人员每月多少钱_恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资...
恩施软件开发学习,恩施软件开发学习哪家好,恩施软件开发学习一般能拿多少工资 首页 > 软件 > 恩施软件开发学习 作者:镀金池 发布时间:2017-11-22 18:54 因为cent ...
- 浅谈移动软件开发与电脑软件开发发展前景
首先,先说下当下的情况,我国经济的高速发展对计算机软件行业需求越来越高,因此国家根据实际需求加大了对软件行业的各项投入,如资金.人力.物力.政策. 软件行业是国家重点鼓励和支持的行业,他的发展前景肯定 ...
- 软件开发丨关于软件重构的灵魂四问
在软件工程学中重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 摘要 在本文中,您会了解到如下的内容: 先添加新 ...
- 在线教育软件开发 教育APP软件开发分析
随着互联网的快速发展,教育机构也纷纷改变了发展模式,教育APP软件的开发大受欢迎,司科认为教育软件的开发不仅能让教学资源共享,更能促进教育行业的发展. 为什么教育类APP软件值得开发 1.使用教育AP ...
- linux 录音软件安装,ubuntu 录音软件audacity 安装和使用
使用HTK过程中,第一步使用HSLab录音和标签功能时,提示找不到/dev/dsp.显然只有旧的内核才支持OSS声音架构.最新的ALSA是没法被HSLab使用的.怎么办呢?网上提供了一些解决方法,但都 ...
- 抢单软件开发原理_软件开发原理
抢单软件开发原理 Rubbish software is produced when we try to do everything at once. 当我们尝试一次做所有事情时,就会产生垃圾软件. ...
- 汽车ECU软件开发之应用层软件与底层软件
随着汽车产品日渐趋向电子化,人们对各类先进的安全系统.高级驾驶辅助系统的接受程度日益提升.而原本昂贵的盲点检测.自动紧急制动等功能的成本下滑,使其快速获得了市场青睐.富士奇美拉研究所(Fuji Chi ...
最新文章
- typora新增主题,typora将主题导入本地
- WOJ 1204 继续找相同
- 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的桌面,显示我的电脑图标
- linux红外键盘映射表,linux下修改键盘映射
- 前端设定项目奖金有多少_华为资深HR:年终奖不是一个合理的奖金制度
- pythonelectron桌面开发案例_electron vue桌面应用入门实例
- c++求n次方_课时9一元二次方程及其应用
- C语言嵌入式系统编程修炼之内存操作
- 白盒测试及其存在的一些问题
- java中的jackson_Java中的JSON数据绑定框架Jackson使用介绍
- 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]
- JSP转译成Servlet详细过程
- LINQ的数据库查询应用(zhuan)
- Atitit 朋友圈 微博 之道 朋友圈的dos and donts
- atitit.MyEclipse10 中增加svn插件故障排除
- 中国省份城市列表(汉字+拼音)
- 每月物品消耗统计表_预算统计表- .doc
- html怎么截取部分图片,【原创】详解css用坐标来截取部分图片
- 三倍快乐!推荐跨Win/Mac/Linux平台免费优质软件
- 【电子设计大赛】2017 年全国大学生电子设计竞赛 仪器和主要元器件清单