作者:林冠宏 / 指尖下的幽灵

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

为了您的直观体验,请务必看完下面 截图,源码 gitHub 链接在其之后。

顺便提一下:

这个是接着我上一次开源的 仿:Android - 微信 - 朋友圈 - 小视频播放,多4句废话算我输 项目的。

目的:

不想为具备相同功能的应用开发做每次的相同代码的编写,再用简洁的风格造轮子。


为了避免大家浪费时间,直接先看下面的 截图,看完后,若你觉得会需要到,那么就请听我继续。



扯下感慨

之前说过的开源IM系统,其实是做好了的,没什么时间写文档,太乱开了也没意义。这次的文章也是挤出时间写的。语言我会尽量做到通俗易懂,少说点废话,谢谢那些一直关注我的同行,定以干货以回报之。

GitHub 链接

本着开源的精神,如果对你有用,希望您能给予个星星(star)

https://github.com/af913337456/SpeexVoiceRecorder

功能点

1,直观的

  • 按键触发录音
  • 上移动或者其它移动可以撤销
  • 动态根据声音分贝显示图片进度效果
  • 录音时间过短的提示

2,隐藏的

  • 0 耦合,dialog 在内的 UI 代码我也集合了,业界风格。
  • 使用方便,下面见解析
  • 低内存占用,提供捞底回收
  • 多接口延伸,例如结果文件路径的返回,和文件的大小
  • 基于 Speex jni 库,高效,自定义语音文件格式

解析

实例:

private VoiceRecorderHelper voiceRecorderHelper;

触发:

// R.id.record 这个 VIew 是你的触发 View
findViewById(R.id.record).setOnTouchListener(
new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN: /** 手指按下 */
voiceRecorderHelper.Action_Down(v,motionEvent);
return true;
case MotionEvent.ACTION_MOVE: /** 移动 */
voiceRecorderHelper.Action_Move(v,motionEvent);
return true;
case MotionEvent.ACTION_UP: /** 抬起 */
voiceRecorderHelper.Action_Up(v,motionEvent);
return true;
}
return false;
}
}
);

初始化:

voiceRecorderHelper =
new VoiceRecorderHelper(
this,
new VoiceRecorderHelper.CallBack()
{
@Override
public String setOutPutPath() {
/** 设置录音结果路径,你的格式也在这里设置 */
return getAudioSavePath("LinGuanHong");
} @Override
public void onDown(View v) {
/** 纯粹的 down 事件回调 */
} @Override
public void onMove_in_limit(View v) {
/** 手指移动的范围在限制内 */
} @Override
public void onMove_out_limit(View v) {
/** 手指移动超过范围,内部做了显示取消的提示 */
} @Override
public void onUp_start(View v) {
/** 纯粹的 Up 事件回调 */
} @Override
public void onUp_cancel(View v) {
/** 这个时候已经因为手指移动超过范围取消了录音 */
} @Override
public void onFinishRecord() {
/** 录音结束 */
} @Override
public void onRecordSuccess(float len, String savePath) {
/** 录音、解码、保存成功 */
Log.e("aaaaa", "录音的路径 " + savePath + " 长度 " + len);
} @Override
public void onRecordVolumeChange(int voiceValue) {
/** 录音声音强度的变化,单位分贝 */
}
}
);
}

技术点 (可以不看)

jni层:编译好 Speex.so 库,使用提供的录制函数。

java层:异步线程录制,获取分贝等数据同步刷新UI

终。

Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包的更多相关文章

  1. Android - 基于 Speex 的高度封装语音库,0 耦合使用

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  2. android studio添加三方jar包

    jar包放项目的libs目录,然后tools,android,sync project with grade files即可.

  3. 共享库方案解决WAS中JAR包冲突

    实现步骤: 1.        准备共享库JAR包 commons-httpclient-3.1.jar httpclient-4.3.3.jar httpcore-4.3.2.jar httpmim ...

  4. 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感

    鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...

  5. Android Studio 使用笔记:在图形界面使用 Gradle 配置项目所需jar包

    在 Android Studio 中使用第三方 jar 包,可以直接下载后添加到项目中,也可以使用 Gradle 配置进行管理.图形界面下十分简单. 点击下图中间的图标,或者选中 Model ,按F4 ...

  6. c++ 封装线程库 0

    1.互斥锁简介 互斥锁主要用于互斥,互斥是一种竞争关系,用来保护临界资源一次只被一个线程访问. POSIX Pthread提供下面函数用来操作互斥锁. int pthread_mutex_init(p ...

  7. Android 代码混淆及第三方jar包不被混淆

    为了保护代码被反编译,android引入了混淆代码的概念 1.设置混淆 在工程下找到project.properties文件 在文件中加入proguard.config=${sdk.dir}/tool ...

  8. eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中

    eclipse运行maven web项目报错: 信息: Starting Servlet Engine: Apache Tomcat/7.0.57 一月 07, 2015 11:50:44 下午 or ...

  9. android studio gradle 打jar 包 (混淆+第三方库包)

    将依赖的第三方库打包进自己的jar包 1.先将第三方的库包拿到,然后添加jar包到项目的libs. 2.项目的build.gradle脚本添加下面的task: task buildJar(depend ...

随机推荐

  1. 阴影锥(shadow volume)原理与展望

    转记:找了不少关于shadow volume原理的资料,还是这个帖子讲解的一目了然,转帖在这里,方便查阅.引用链接:http://blog.donews.com/yyh/archive/2005/05 ...

  2. 【翻译自mos文章】在RHEL7/OL7上安装Oracle 12.1.0.2的server端或者client时,报须要"compat-libstdc++"包

    在RHEL7/OL7上安装Oracle 12.1.0.2的server端或者client时,报须要"compat-libstdc++"包 来源于: Installation of ...

  3. 内存管理 初始化(六)vmalloc_init 及 ioremap

    是不是我错了,本想这个函数会如网上所说将进行非连续内存管理的初始化,但是对于2.6.34的ARM架构而言,该函数实际完成的业务非常少. 内存管理的初始化读到此处,我感觉原有的认识存在很大缺陷: (1) ...

  4. Java编程思想学习笔记——接口

    1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...

  5. 1. 自动化运维系列之Cobbler自动装机

    preface 我们之前批量安装操作系统的时候都是采用pxe来安装,pxe也是通过网络安装操作系统的,但是PXE依赖于DHCP,HTTP/TFTP,kicstart等支持.安装流程如下所示: 对于上面 ...

  6. Webkit内核探究【1】——Webkit简介

    出处:http://www.cnblogs.com/jyli/archive/2010/01/31/1660355.html作者:李嘉昱 研究Webkit内核已经有一段时间了,在这期间我花了很多时间去 ...

  7. python登录网易163邮箱,爬取邮件

    from common import MyRequests,LoggerUntil,handle_exception myRequests.update_headers({ 'Accept':'tex ...

  8. Aspose------导入Excel

    代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...

  9. SpringBoot thymeleaf模板版本,thymeleaf模板更换版本

    SpringBoot thymeleaf模板版本 thymeleaf模板更换版本 修改thymeleaf模板版本 ================================ ©Copyright ...

  10. JSONP 劫持漏洞实例

    0x01 Jsonp简介 Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从 ...