Android 录音实现方法、仿微信语音、麦克风录音、发送语音、解决5.0以上BUG

本文修改自:http://www.jianshu.com/p/06eca50ddda4




效果图(注!由于使用的模拟器录制,所以图片中的录音时候话筒上下波动比较小,手机上正常!):

这里写图片描述



使用方法:



录音工具类: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(),注意,取消录音不保存文件,结束录音会保存文件!


在布局文件中添加一个控件(任意一个都行)

<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;}});


OK,就这么简单,demo下载:点击免费下载







下面放一个原作者的封装好的自定义的View,继承自Button,直接放入布局文件后,就可以使用,并封装好了PopupWindow,使用更简单,至于两种方式的好坏看个人需求

效果图:

这里写图片描述


使用:


布局中引入就行了:

<cn.zeffectn.view.recordbutton.view.RecordButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="录音按钮"android:id="@+id/button"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true" />

oK,完了,demo下载:点击免费下载




关于上面的mImageView.getDrawable().setLevel()可以看这篇:http://blog.csdn.net/fan7983377/article/details/51750864





文本所有下载(已上传新Demo,添加6.0权限申请):第一个Demo | 第二个Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25347.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能听懂语音的ChatGPT来了:10小时录音扔进去,想问什么问什么

类 ChatGPT 模型的输入框里可以粘贴语音文档了。 大型语言模型&#xff08;LLM&#xff09;正在改变每个行业的用户期望。然而&#xff0c;建立以人类语音为中心的生成式人工智能产品仍然很困难&#xff0c;因为音频文件对大型语言模型构成了挑战。 将 LLM 应用于音频文件的一…

weui icon图标大全

转载 https://blog.csdn.net/qq_36433857/article/details/84190038

git 突然不出 绿色,红色的图标了

winr 打开后找到“HKEY_LOCAL_MACHINE–>SOFTWARE–>Microsoft–>Windows–>CurrentVersion–>Explorer–>ShellIconOverlayIdentifiers”这一项 将Tortoise相关的项都提到靠前的位置&#xff08;重命名&#xff0c;在名称之前加几个空格&#xff09; &am…

git绿色、红色图标不显示的问题(有图有真相)

今天在使用git的时候发现项目没有图标显示&#xff0c;感觉很难受&#xff0c;百度搜了好多&#xff0c;感觉这个挺好用的&#xff0c;记录一下。 图标&#xff0c;我们一般情况下就用两个图标&#xff0c;红标和绿标 顾名思义&#xff1a;绿标是指代码提交成功的&#xff0c;红…

exe文件更换图标方法

exe文件更换图标 想更换exe文件的默认图标&#xff0c;但又不想下载什么软件&#xff0c;在网上搜索后找到一种不需要下载特定软件的“欺骗法”。 注意&#xff1a;本方法并不是真的更换了exe文件的图标&#xff0c;而是为exe文件包装了一个壳子&#xff0c;使得外观上看起来更…

如何引入iconfont中的单色图标和多色图标(超简单)

网址&#xff1a;iconfont-阿里巴巴矢量图标库 超简单&#xff01;再不会引入就过分了哈! 一、单色图标引入 1、选择需要的图标 2、创建新项目、添加至该项目、下载到本地 3、将压缩包解压到自己的代码文件夹中 4、在html中link引入并回到网址上复制图标代码 5、以i标签和icon…

VC应用 -个性化你的工具栏图标

1、首先&#xff0c;提供一些最好的图标&#xff0c;大家可以省去自己绘画图标的功夫&#xff0c;可以从繁琐的绘图工作中解脱出来。 ToYcon 在线网页转换PNG-ICON http://converticon.com/ 一个非常好的ICO图标查找网站 http://www.iconfinder.net http://www.iconlet.c…

iconfont 彩色图标的使用

之前写过iconfont单色图标的应用&#xff0c;今天来介绍一下彩色图标的使用 文章目录 一、去iconfont矢量图库下载素材1、挑选自己喜欢的素材2、然后下载到本地&#xff0c;是个压缩包3、把压缩包解压到你的项目底下4、打开解压后的文件5、打开demo_index.html 二、在页面中引入…

下载iconfont图标

iconfont.js&#xff1a; const fs require(‘fs’); const https require(‘https’); // 解压工具&#xff0c;需要安装 const Admzip require(‘adm-zip’); // 项目成员在阿里图标库网站的cookie const cookie require(‘./iconfont.json’).cookie; // 阿里图标库域…

引入icon图标

最新方法:使用svg-sprite-loader引入icon 一.svg-sprite-loader的基本使用 1.在iconfont.cn下载好需要的图标后,把它添加到项目assets里并引入。 那如何引入呢&#xff1f; &#x1f50d;typescript svg cannot find module 方法:在系统文件shims-vue.d.ts里添加如下代码 sr…

Qt 更改exe图标显示

1、制作.ico格式图标。 &#xff08;网上有在线转换工具) 2、将制作好的ico图标重新命名&#xff0c;比如&#xff1a;exe._ico.ico,然后拷贝到项目工程.pro相同路径下。 3、在Qt 项目工程文件下.pro。添加一行 : RC_ICONS exe_ico.ico 4、重新构建可执行程序。

震撼来袭,GPT-4全解读

今年3月&#xff0c;OpenAI团队正式宣布&#xff1a;GPT-4 来了&#xff01; 微信搜索关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 OpenAI发布的GPT-4是深度学习方面的最新里程碑。GPT-4是一个大型的多模态模型&#xff08;可接收图像和文本输入…

chatgpt赋能python:Python发短信给手机:一种快速高效的通讯方式

Python 发短信给手机&#xff1a;一种快速高效的通讯方式 在当今数字化的时代&#xff0c;手机已成为人们日常生活不可或缺的一部分。然而&#xff0c;对于那些需要快速高效地与手机用户进行通讯的人们来说&#xff0c;传统的打电话和发送短信的方式则显得有些过于繁琐。对于这…

chatgpt赋能python:如何使用Python读取手机短信

如何使用Python读取手机短信 在现代社会&#xff0c;短信已成为人们生活中不可或缺的一部分。那么&#xff0c;如何利用Python读取手机短信呢&#xff1f;本文将介绍如何使用Python读取手机短信&#xff0c;并提出一些相关的建议。 什么是Python Python是一种高级的、开源的…

chatgpt赋能python:Python如何免费群发短信

Python如何免费群发短信 在数字化时代&#xff0c;短信成为了快速高效的沟通方式之一。针对群发短信需求&#xff0c;市场上存在着多种短信群发软件&#xff0c;而Python作为一个强大的编程工具&#xff0c;也可以轻松实现免费的短信群发功能。本篇文章将为大家介绍如何通过Py…

chatgpt赋能python:Python短信通知:方便快捷的业务提醒方式

Python短信通知&#xff1a;方便快捷的业务提醒方式 在现代社会&#xff0c;很多企业和组织需要及时地向员工、客户和用户发送通知&#xff0c;以便于协调业务和提高效率。而短信通知作为一种常用的业务提醒方式&#xff0c;已经成为了很多组织中不可或缺的一部分。Python语言…

北京十大律师事务所(排名涉及刑事、拆迁婚姻)

无论任何行业&#xff0c;首先要敬业。你需要了解&#xff1a;这个行业是干什么的&#xff1f;你在行业中处于什么地位&#xff1f;这个行业在社会各界的地位和价值如何&#xff1f;它的基本价值观是什么&#xff1f;作为律师&#xff0c;首先要对行业有敬畏感、尊崇感&#xf…

中国裁判文书网(2020最新版)

1.序言 因业务需要去爬取裁判文书网&#xff0c;查看了网上的诸多教程发现裁判文书网的反爬更新频率很高&#xff0c;但是从19年8月份更新之后再也没有新的更新了。估计是现在的反爬已经足够使用了&#xff0c;裁判文书网的反爬主要有四种。听我一一道来 2.正文 裁判文书网的…

甄选北京十大律师事务所排名榜(资深团队、胜诉率高)

根据司法部数据统计得知&#xff0c;截至2022年第三季度&#xff0c;全国共有执业律师50万多人。全国共有律师事务所4万多家。律师行业正在正确的轨道蓬勃发展中。我们期待律师行业的不断壮大和发展&#xff0c;也希望更多的人能通过法律途径维护自己的合法权益。 大家都知道北…

违反 GPL 协议,法院判罚了!国内首例

公众号关注 “GitHub科技” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 来自开源中国 近日&#xff0c;一起关于 GPL 版权纠纷案裁判文书公示。一审判决书显示&#xff0c;GPL3.0 协议是一种民事法律行为&#xff0c;具有合同性质&#xff0c;可认定为授权人与用…