android音量键调节听筒音量的大小

最近发现微信的语音功能可以在听筒和喇叭间互相切换并且可以使用音量按键进行调节,之前在项目开发中只用到音频的多媒体类型播放音频文件但没用到听筒,所以就写了个demo使用听筒播放音频文件,用到的代码如下:

        audioManager.setSpeakerphoneOn(false);audioManager.setMode(AudioManager.MODE_IN_CALL);mediaPlayer = new MediaPlayer();try {mediaPlayer.setDataSource(this, Uri.fromFile(new    File(getExternalCacheDir(), "tada.ogg")));} catch (IOException e) {e.printStackTrace();}mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);mediaPlayer.setLooping(true);try {mediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}mediaPlayer.start();

使用以上方式播放时,音量键调节始终调节的是“铃声和通知“的音量大小,对比打电话时可以调节听筒大小感觉很疑惑 ,追踪源码得知,处理音量按键的最终现实在AudioService.java文件中。
定位到函数

    public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,String callingPackage) {if (DEBUG_VOL) Log.d(TAG, "adjustSuggestedStreamVolume() stream="+suggestedStreamType);int streamType;if (mVolumeControlStream != -1) {streamType = mVolumeControlStream;} else {streamType = getActiveStreamType(suggestedStreamType);}// Play sounds on STREAM_RING only and if lock screen is not on.if ((streamType != STREAM_REMOTE_MUSIC) &&(flags & AudioManager.FLAG_PLAY_SOUND) != 0 &&((mStreamVolumeAlias[streamType] != AudioSystem.STREAM_RING)|| (mKeyguardManager != null && mKeyguardManager.isKeyguardLocked()))) {flags &= ~AudioManager.FLAG_PLAY_SOUND;}if (streamType == STREAM_REMOTE_MUSIC) {// don't play sounds for remoteflags &= ~(AudioManager.FLAG_PLAY_SOUND|AudioManager.FLAG_FIXED_VOLUME);//if (DEBUG_VOL) Log.i(TAG, "Need to adjust remote volume: calling adjustRemoteVolume()");mMediaFocusControl.adjustRemoteVolume(AudioSystem.STREAM_MUSIC, direction, flags);} else {adjustStreamVolume(streamType, direction, flags, callingPackage);}}private int getActiveStreamType(int suggestedStreamType) {if (mVoiceCapable) {if (isInCommunication()) {if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)== AudioSystem.FORCE_BT_SCO) {// Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO...");return AudioSystem.STREAM_BLUETOOTH_SCO;} else {// Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL...");return AudioSystem.STREAM_VOICE_CALL;}} else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {if (isAfMusicActiveRecently(DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) {if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active");return AudioSystem.STREAM_MUSIC;} elseif (mMediaFocusControl.checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)){if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC");return STREAM_REMOTE_MUSIC;/// M: Add for FM volume adjust @ {} else if (isFmOn()) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_FM...");return AudioSystem.STREAM_FM;/// @}} else {if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_RING b/c default");return AudioSystem.STREAM_RING;}} else if (isAfMusicActiveRecently(0)) {if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active");return AudioSystem.STREAM_MUSIC;/// M: Add for FM volume adjust @ {} else if (isFmOn()) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_FM...");return AudioSystem.STREAM_FM;/// @}} else {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type "+ suggestedStreamType);return suggestedStreamType;}} else {if (isInCommunication()) {if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)== AudioSystem.FORCE_BT_SCO) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO");return AudioSystem.STREAM_BLUETOOTH_SCO;} else {if (DEBUG_VOL)  Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL");return AudioSystem.STREAM_VOICE_CALL;}} else if (AudioSystem.isStreamActive(AudioSystem.STREAM_NOTIFICATION,DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS) ||AudioSystem.isStreamActive(AudioSystem.STREAM_RING,DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_NOTIFICATION");return AudioSystem.STREAM_NOTIFICATION;} else if (suggestedStreamType == AudioManager.USE_DEFAULT_STREAM_TYPE) {if (isAfMusicActiveRecently(DEFAULT_STREAM_TYPE_OVERRIDE_DELAY_MS)) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: forcing STREAM_MUSIC");return AudioSystem.STREAM_MUSIC;} elseif (mMediaFocusControl.checkUpdateRemoteStateIfActive(AudioSystem.STREAM_MUSIC)){if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_REMOTE_MUSIC");return STREAM_REMOTE_MUSIC;/// M: Add for FM volume adjust @ {} else if (isFmOn()) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_FM...");return AudioSystem.STREAM_FM;/// @}} else {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: using STREAM_MUSIC as default");return AudioSystem.STREAM_MUSIC;}/// M: Add for FM volume adjust @ {} else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) {if (DEBUG_VOL)Log.v(TAG, "getActiveStreamType: Forcing STREAM_MUSIC stream active");return AudioSystem.STREAM_MUSIC;/// M: Add for FM volume adjust @ {} else if (isFmOn()) {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_FM...");return AudioSystem.STREAM_FM;/// @}} else {if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Returning suggested type "+ suggestedStreamType);return suggestedStreamType;}}}private boolean isInCommunication() {boolean isOffhook = false;if (mVoiceCapable) {try {ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));if (phone != null) isOffhook = phone.isOffhook();} catch (RemoteException e) {Log.w(TAG, "Couldn't connect to phone service", e);}}return (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION);}

解释下以上代码
音量按键经过事件分发处理最后会调用adjustSuggestedStreamVolume方法,之后在
getActiveStreamType方法中鉴定出最终的stream type ,在该方法中 会作出一个判断,isInCommunication() 中的返回 (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION); 这个两个条件只需满足其中之一便可返回true ,从而使getActiveStreamType方法返回


return AudioSystem.STREAM_VOICE_CALL;

而不是默认的

Log.v(TAG, "getActiveStreamType: Forcing STREAM_RING b/c default");
return AudioSystem.STREAM_RING;

因此只需将

audioManager.setMode(AudioManager.MODE_IN_CALL);

换成

audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

音量按键就可以调节听筒音量大小了

android音量键调节听筒音量的大小相关推荐

  1. Android通过音量键调节音量大小

    通过程序实现对android系统手机音量的调节 1.获得系统服务 AudioManager(音频管理器)了,该类位于Android.Media包下,提供了音量控制与铃声模式相关操作!使用Context ...

  2. android 音量 广播,Android平台音量调节(一)音量键调节音量

    Android平台音量调节 本文基于Android 8.0讲述Android平台原生音量控制功能. 流的定义 Android中,音量都是分开控制,各种流定义各种流的音量.在Android8.0中,定义 ...

  3. android:SeekBar控制系统音量(媒体音量键和通话音量键的diallog自动切换调节控制)

    前言:之前看了很多关于android的关于音量调节的文章,始终没有自己想要的那种或者没查询到,于是下载了一位网友上传的资源demo上进行了改编和调整,修改出来一个可以在媒体和通话过程中两种场景下自动切 ...

  4. 手机音量键只能调音量?华为:我这还有7个功能麻烦了解一下

    手机音量键是用来干什么的?那还用问,调节音量的啊,但是华为手机的音量键还有多种妙用,不知道你了解几个呢? 一.传统截屏 我们在使用手机最常使用的一种截屏方式就是使用音量下键+电源键,这个操作在大多数手 ...

  5. Android音量调节(一)音量键的处理流程

    文章目录 1.Android音量键调节音量流程 2.Android流定义 3.按键的处理流程 3.1 adjustSuggestedStreamVolume 3.2 adjustStreamVolum ...

  6. Android - 仿iPhone调节音量/亮度

    项目需要用到调节音量及亮度,效果类似iPhone.需求点击增加音量键后现实音量界面并增加下方小格子,用户不再点击调节音量后音量界面会在4s后消失. 整个功能用Service实现,在Service中创建 ...

  7. 安卓自定义音量键_手机跟我学第十四课——如何调节手机音量

    银 / 发 / 学 /堂 手机跟我学 如何调节手机音量 各位同学们,大家好,我是小银班长 随着科技的发展,手机已经越来越离不开咱们的日常生活.但是咱们中老年人吧,不像年轻人学的那么快,有些东西总是弄不 ...

  8. 华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗

    华为手机音量键技巧合集,很少有人全部掌握的7个技巧,你会用吗 本文专门为花粉所写,或者说目前正在使用华为手机以及打算入手华为手机的用户们,所提供的华为音量键技巧合集.很少有人能够全部掌握这6个关于音量 ...

  9. 音量键唤醒屏幕方法技术

    方法一. 通过本教程的修改,你可以实现: 1.屏幕关闭状态下使用音量+-键即可唤醒屏幕,注意是唤醒,也就是点亮屏幕. 2.音量键本身的音量调整功能不被破坏.(目前大部分通过修改QWERTY文件来   ...

最新文章

  1. 【Python教程】两种方法教你拆分含有多种分隔符的字符串
  2. ​稳健、可靠全真即时通信网的架构与应用
  3. cmfclistctrl怎么设置某列文字颜色_ppt实用技巧:如何轻松设置合意的超链接
  4. C语言入门I love China,C语言从入门到精通
  5. Sharepoint 2010 根据用户权限隐藏Ribbon菜单
  6. WINCE快捷方式详解
  7. Python excle数据读写
  8. u-boot移植随笔:困难重重,前路未知
  9. java学习之类型转换与越界
  10. [转载] python画柱状图-Python绘制精美图表之双柱形图
  11. 小白如何上手产品经理
  12. lede 内核 单 编_openwrt详细设置教程,lede固件设置中文
  13. Attachments in Oracle Form
  14. nc 二次开发_金蝶云星空(K3CLOUD)和用友NC对比
  15. android自定义上拉刷新,Android RecyclerView自定义上拉和下拉刷新效果
  16. 树莓派python3导入cv2
  17. java比特率转换,amr转换mp3所需的编码器、比特率、节录率、声音频道分别是什么?...
  18. visio绘制网络拓扑图要求_必备!可以电脑在线使用的3款网络拓扑图软件安利
  19. 千呼万唤始出来的京东HR面(2023暑期实习)
  20. 干货:中国移动互联网行业深度报告

热门文章

  1. c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨
  2. Python---统计《三国演义》中出现次数较高的人物
  3. [irisctf 2023] rev
  4. 光功率 博科交换机_交换机光功率
  5. 非微信官方网页解决方法
  6. pdf和word等文档添加水印
  7. Php替换公众号图片替换,公众号文章发布后可以替换图片吗?公众号发出去的图片怎么替换?...
  8. linux系统制作usb启动盘,教你制作Linux操作系统的USB启动盘
  9. 一年级计算机课画画用什么,一年级孩子学画画该学哪种
  10. 从融360到理财魔方、再到韭菜财经,新金融正确姿势为哪般?