项目app录音问题:手机系统录音机在录音过程中退到后台录音,此时打开项目app开始录像,因为录音功能被系统录音机占用,导致项目app不能正常使用录音功能,录制下来的视频文件不能正常播放。检测出现问题的原因,可能有如下三种:

第一种,就是start的时候会报异常,这种我们把它包在try catch中即可捕获到异常。在此不多累述。

第二种,就是不报异常,正常执行,这种情况我们没办法去判断系统是否禁止了我们的app的录音权限,所以我在此分析的是部分机型在被禁止后不报异常,我们可以去检测音频振幅大小,部分机型的音频振幅值在用MediaRecorder时是0,在用AudioRecord时值小于0,所以这种情况我们可以通过其振幅值判断, 
AudioRecord判断方法:

int readSize = 0;
/*--实时录音写数据--*/
readSize = audioRecord.read(buffer,0,minBufferSize);
if (readSize < 0) {
//录音出现异常
} 

该方法能检测到大部分机型录音被禁止,或其他异常状况。

第三种,MediaRecorder判断方法: 
MediaRecorder就不怎么好检测了,因为MediaRecorder在用方法getMaxAmplitude()时取得振幅值是0-32767,也就是即使不禁止录音权限,振幅值依然会有0值出现,所以不能简单地判断振幅值是否为0,我在此的检测方法是根据前1s的录音,取10次振幅值进行判断: 
先声明三个变量:

private int vocAuthority[] = new int[10];private int vocNum = 0;private boolean check = true;

然后写个方法:

int vocLevel = mRecorder.getMaxAmplitude();if (check) {if (vocNum >= 10) {Set<Integer> set = new HashSet<Integer>();for (int i = 0; i < vocNum; i++) {set.add(vocAuthority[i]);}if (set.size() == 1) {if (handler != null)handler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD);vocNum = 0;vocAuthority = null;vocAuthority = new int[10];}else{check = false;}} else {vocAuthority[vocNum] = vocLevel;vocNum++;}}
  • 该方法每100ms执行一次,1s十次后判断vocAuthority中的值是否全部一样,也就是说是否全部为零,如果全部一样那么录音肯定有问题。(我试了如果在非常安静的情况下前十次的取值也不是都为零,大家可以试试)

第三种,还有部分机型不仅不报异常,而且在录音时会制造音频振幅的假数据,也就是虽然录音被禁止,系统依然会把音频振幅反馈给你,像华为p7就是这样,这种情况肯定不能再去检测音频振幅了,只能另辟蹊径,通过我的观察发现在用MediaRecorder录音时,如果被禁止那么本地不会出现录音文件,所以我们可以以此为突破口,检测本地是否有生成的录音文件来判断系统是否禁止了我们的录音权限。

AudioRecord我没试,大家可以试试。

Android录音机占用录音功能,其他app无法正常使用录音功能相关推荐

  1. android 设备占用_如何查看正在占用Android设备的空间

    android 设备占用 When you picked up your shiny new Android device, you probably thought "yeah, this ...

  2. [免费专栏] Android安全之动态调试APP的一些技巧「Android Studio调试」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  3. 【Android项目实战 | 从零开始写app(十二)】实现app首页智慧服务热门推荐热门主题、新闻

    说在前面,由于各种adapter,xml布局,bean实体类,Activity,也为了让看懂,代码基本都是"简单粗暴直接不好看",没啥okhttp和util工具类之类的封装,本篇幅 ...

  4. android卸载按钮不能用了,不用ROOT 干掉Android里无法卸载的APP

    原标题:不用ROOT 干掉Android里无法卸载的APP 点击上方"电脑爱好者"关注我们 Android手机最让人不放心的是什么?没错,就是各种存在"潜规则" ...

  5. Android Studio 实现的画板App

    基于Android Studio 实现的画板App ** 1.实现目标** 随着科技的不断发展和社会的不断进步,手机越来越流行,成为了人们日常生活和学习的必要工具,人们越来越离不开手机,还在几年前手机 ...

  6. 【Android】获取当前的app中cpu和内存的百分比 -调研报告

    背景 项目要求获取当前app运行时的cpu和内存状况. 调研 CPU获取 Android实现获取当前的app的cpu实时使用情况的代码 以下是获取当前app的CPU实时使用情况的代码(Java): p ...

  7. Android ADB工具-管理设备 app(二)

    Android ADB工具-管理设备 app(二) 标签(空格分隔): Android 4.管理设备 app 命令 功能 adb install [-r|-s] <apkfile> 安装 ...

  8. 简单Android手机APP地图,android最简单手机地图APP(只需5分钟)

    android最简单手机地图APP--只有三部分. 第一部分 首先建立一个MapActivity在setContentView(R.layout.activity_map);中创建一个代码如下. [h ...

  9. Android: Execution failed for task ':app:processDebugResources' 异常解决

    Android: Execution failed for task ':app:processDebugResources' 解决: sudo apt-get install -y lib32gcc ...

最新文章

  1. 漏洞评估的优先级决定了网络安全保护的成本
  2. 2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
  3. C语言 | C51实现NRF905收发设计(完整源代码)
  4. Flex Socket 安全沙箱问题解决
  5. ARM机器学习新平台Trillium
  6. linux文件本编辑,Linux就该这么学 -- 命令 -- 文本文件编辑命令
  7. Windows下怎样安装Tomcat
  8. 使用mongoose 在 Node中操作MongoDB数据库
  9. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
  10. C++基础::mutable 关键字
  11. tshark/wireshark/tcpdump实战笔记(更新中...)
  12. XBAP 承载 Silverlight 的示例
  13. UVA 1449 - Dominating Patterns AC自动机
  14. What is yield
  15. 用USBISP/USBasp编程器给Atmega328P下载Arduino bootloader引导程序
  16. 计算机考研C语言题库
  17. 史上最新最全的ADB命令行
  18. 微信图文素材中图片url替换
  19. html+怎么播放avi视频,视频格式怎么修改?
  20. JIRA消息通知打通钉钉群

热门文章

  1. 浅析多元化互动方式促进抖音强社交属性
  2. 群晖918 docker命令行方式安装jellyfin并开启GPU硬解的方法
  3. c语言六个数码管显示123456,用51单片机C语言编写程序实现6位共阴极数码管循环显示0123456789ABCDEF,六个数码管是连续不同的六个数?...
  4. Nature Outlook专题:肠道菌群研究的现在和未来 | 热心肠日报
  5. 3D真人手办自己也能做,颠覆你的想象!
  6. samba/本地文件共享
  7. HTTP中的中文编码与在线编码转换工具
  8. PropTypes 和组件参数验证
  9. hive-sql调优
  10. python-下载固定百度图片地址