1、麦克风被占用

做过Android音视频开发的可能会碰到过这样的问题,在录音时,发现麦克风被占用,解决办法也很简单,给个提示说麦克风被占用即可,如何知道麦克风被占用呢?根据网上答案,原理就是开一个录音试试,如果不能录音,说明被占用了,代码如下:

/** 判断麦克风是有效,有效返回true,否则返回false */
fun validateMicAvailability(): Boolean {var available = falseval recorder = AudioRecord(MediaRecorder.AudioSource.MIC, 44100,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_DEFAULT, 44100)try {Timber.i("麦克风当前状态:${recorder.recordingState}")// 使用MediaRecorder正在录音时,调用此方法发现状态也是停止状态,// 所以这个状态不可信,具体还是要看能否启动录音来判断recorder.startRecording() // 即使麦克风被占用,这里调用也不会抛异常。但如果没被占用,则录制状态会变成AudioRecord.RECORDSTATE_RECORDINGTimber.i("调用录制后麦克风当前状态:${recorder.recordingState}")if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {available = trueTimber.i("麦克风开始录制,没有被占用")} else {Timber.i("麦克风没有开始录制,说明被占用")}} catch (e: Exception) {Timber.e(e, "发生异常了,应该是麦克风被占用了")} finally {recorder.release()}return available
}

2、扬声器被占用

什么扬声器还能被占用?对于麦克风被占用应该很多人是知道的,但是很多人不知道扬声器也会被占用,在搜索这个知识点的时候就会发现找不到答案,因为开发这一块的相比录音这一块的要少的多。当我们打电话时,扬声器或者说听筒就会被占用,你此时放音乐肯定是没有声音的。

公司里有个项目用到了一个开源框架,已经实现了语音通话功能,领导希望实现按一下手机的一个按键实现禁止说话,再按一下又可以说话,这只是对于自己是否可以说话,但是听是一直都可以听的,就像使用对讲机一样,有时候,你不看屏幕的话,你不知道当前是否打开了说话的开关,所以希望在按这个开关键的时候发出提示音,开是一个提示音,关又是另一个提示音,这样即使不看屏幕的显示状态也能知道当前的说话开关状态是开还是关,看似很简单的功能,不就是播放两个提示音嘛,我三下两除二就把代码写好了,但是用到项目中时发现提示音并没有发出声响来,刚开始以为代码有问题,后来才知道原来扬声器也会被占用的,当语音通话的时候,声音类型是设置成了通话类型的,只要设置成了通话类型,自动就会给你占用扬声器,避免语音时还能听到别的软件发出来的声音,后来试过把声音类型改成Music,问题解决,但是仔细想想,人家系统既然设置通话类型应该占用扬声器,肯定是有一定的道理的,语音通话了,就不应该让音乐播放器发出声音,后来在同事的提醒下解决了问题,所以说同事之间的交流还是很有必要的。

解决方案:
既然语音时占用了扬声器,是你的应用在语音,那就是你的应用在占用扬声器,则我们可以在使用扬声器的地方去播放提示音即可,公司的项目是使用AudioTrack来播放来自网络的语音流的,它接收的是PCM数据的字节数组,所以我们就把提示音转换为PCM格式保存为文件,放在项目中,然后通过输入流读入内存,因为容量不算大,很短的语音,但也不算小,所以我不想每次播放时都读这个文件,所以我就使用了软引用,把文件读到字节数组后保存在软引用中,内存不足时可以回收,使用时先从软引用拿,拿不到再读文件,读到了又放入软引用中。

Android手机麦克风和扬声器被占用相关推荐

  1. Android手机听筒和扬声器切换

    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);private void setSp ...

  2. android 手机听筒和扬声器切换 听筒没声音问题

    am.setMode(AudioManager.STREAM_MUSIC); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  俩 ...

  3. html5 手机 麦克风,android 如何检测手机上的麦克风被占用的问题!

    如题 怎么检测 各位大佬榜个忙 微信上是有检测的 就是当手机上的麦克风被某软件占用的时候 会弹出这句话! 回答: private boolean validateMicAvailability(){ ...

  4. 手机的麦克风和扬声器,距离宜远

    手机的麦克风和扬声器,距离宜远 红朝儒生 2014-8-29 关键字:手机 麦克风 扬声器 简介:随着科技的发展,手机视频通话,是大势所趋.而这种麦克风和扬声器在一起的设计,会莫名其妙的带来通话方面的 ...

  5. Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据

    如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!! 目标 Android手机HC-05蓝牙连接Arduino nano获取DHT-11温 ...

  6. Android手机直播(三)声音采集

    一.文章说明 开始写文章了,才知道写文章真心耗费心力,希望自己尽量做到快速更新,也希望这些文章真心能帮助到开发者们. 这篇文章主要讲述Android声音采集相关的知识,首先介绍声音的基础知识,然后介绍 ...

  7. 教你玩转安卓Android手机50招秘籍

    虽然Android操作系统的用户界面和交互经过两年的发展已经非常人性化,但是有些操作和使用还是让很多刚接触的菜鸟用户感到复杂和困惑.我们整理出Android系统的50大必备秘籍供用户参考,适合各种阶段 ...

  8. Android手机屏幕RTMP推流工具

    Android手机屏幕RTMP推流工具是基于ffmpeg+opencv开发的C++(eclipse.androidstudio)程序,是一款可以将安卓手机屏幕上的任何内容推送到任意一款rtmp服务器上 ...

  9. Android 手机百科全书: 新手入门

    什么是widget? Widget的这个创想来自一个叫做Rose的苹果电脑工程师.98年的一天,Rose在自己的苹果操作系统桌面玩一个可以更换皮肤的MP3播放器时忽发奇想:如果在我桌面上运行的所有工具 ...

最新文章

  1. javascript、jQuery的扩展方法,扩展实例展示代码
  2. python画不出来图是什么原因-完美解决ARIMA模型中plot_acf画不出图的问题
  3. Netty实战 IM即时通讯系统(九)实现客户端登录
  4. 搞懂C++为什么难学,看这篇就够了!
  5. java 静态对象语法_04.Java 语法
  6. pandas颠倒dataframe与series的顺序
  7. hdu 1556 Color the ball (线段树做法)
  8. Angular动态注册组件(controller,service...)
  9. FlyMcu开始连接一直未接收到的解决方案
  10. mapminmax()、zscore()数据归一化
  11. 软件测试师的工作流程是什么?
  12. 网易互娱2020-9月22日笔试题记录
  13. unbuntu安装MySQL
  14. 完整的次世代3D游戏建模制作流程,学习教程分享
  15. Scrapy使用MailSender发送邮件
  16. 转帖 金庸所有门派以及所有门派下的所有武功一览
  17. 使用karma + mocha + sinon 测试 Ajax 请求
  18. 力扣(392.521)补8.26
  19. 深聊性能测试,从入门到放弃之: Windows系统性能监控(三)任务管理器介绍及使用。
  20. linux ps与top 命令下wa,hi,si,st等及 VSZ,RSS,VIRT,RES,等关键字含义详解!

热门文章

  1. 免费分享全套吴恩达深度学习课程笔记以及编程作业集合
  2. 16.JAVA之前端,HTML,CSS(选择器,盒子模型),JS,JQuery,Json,ajax
  3. docker容器错误码
  4. python运维面试题_百度linux运维开发工程师面试真题经历+试题
  5. element table 合计 第一行 固定列
  6. MATLAB二维曲线
  7. Office Word中横线的增加和删除方法
  8. wlanFineCFOEstimate 详解
  9. C++ 打怪游戏 小镇5.3.0--怪物狂欢季
  10. 怎么修改c语言的缓冲区大小,C中的缓冲区大小