Android 拦截音量键,控制系统媒体音量

上一篇文章中介绍过,在做 SAPA 适配时由于其直连驱动层不经过 Android 的音量增益控制,所以调节系统媒体音量对音量改变无效。如果没有音乐在放的时候,按调节音量的键,默认调节的是铃声的音量,所以在使用 SAPA 播放音频时,因为不经过 Android 层,系统认为没有音乐播放,在按音量键时调节的是铃声音量无法控制播放音量。

思路:

  • 调用系统 API 强制设置为控制媒体音量

  • 截获物理音量键的按键事件,在按音量键时,调出音量显示面板,改变其音量;

参考:

多媒体音量控制介绍

AudioManager的应用

思路一,系统确实提供了 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);
            }
        }
  • lowerMusicVolume()显示系统音量面板并降低媒体音量

    
    /**
         * 显示系统音量面板并降低媒体音量
         */
        public void lowerMusicVolume() {
            if (mAudioManager != null) {
                //强制降低多媒体音量
                mAudioManager.adjustStreamVolume(
                        AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_LOWER,
                        AudioManager.FLAG_SHOW_UI);
            }
        }
调用方式:

在要控制的 Activity 中重载 onKeyDown 方法,如下:


@Override
    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);
    }

你可能感兴趣的:(原创,Android)