上一篇文章中介绍过,在做 SAPA 适配时由于其直连驱动层不经过 Android 的音量增益控制,所以调节系统媒体音量对音量改变无效。如果没有音乐在放的时候,按调节音量的键,默认调节的是铃声的音量,所以在使用 SAPA 播放音频时,因为不经过 Android 层,系统认为没有音乐播放,在按音量键时调节的是铃声音量无法控制播放音量。
思路:
调用系统 API 强制设置为控制媒体音量
截获物理音量键的按键事件,在按音量键时,调出音量显示面板,改变其音量;
参考:
思路一,系统确实提供了 API : forceVolumeControlStream(int streamType) ,但该方法被隐藏了,可以利用反射的机制调用。本文主要是讲解和使用思路二。
本文中是在上一篇:Android 监听系统媒体音量变化的基础上增加了两个接口(放在在 VolumeChangeObserver.java 中):
raiseMusicVolume() :显示系统音量面板并增加媒体音量
/** * 显示系统音量面板并增加媒体音量 */ public void raiseMusicVolume() { if (mAudioManager != null) { //强制增大多媒体音量 mAudioManager.adjustStreamVolume( AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); } }
显示系统音量面板并降低媒体音量
/** * 显示系统音量面板并降低媒体音量 */ public void lowerMusicVolume() { if (mAudioManager != null) { //强制降低多媒体音量 mAudioManager.adjustStreamVolume( AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI); } }
调用方式:
在要控制的 Activity 中重载 onKeyDown 方法,如下:
public boolean onKeyDown(int keyCode, KeyEvent event) { if (mVolumeChangeObserver != null) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP://增大系统媒体音量 mVolumeChangeObserver.raiseMusicVolume(); return true; case KeyEvent.KEYCODE_VOLUME_DOWN://减小系统媒体音量 mVolumeChangeObserver.lowerMusicVolume(); return true; default: break; } } return super.onKeyDown(keyCode, event); }