Android P按键静音流程

本文详细介绍了Android系统如何实现按键静音功能,从DecorView到AudioService,再到AudioSystem,深入分析了静音按键的调用流程和关键代码,展示了音量设置到0以实现静音的效果。
摘要由CSDN通过智能技术生成

今天跟了一下Android系统按键静音的流程,Android实现了在系统层面静音。输出给底层的音量为0。

按键使用注入按键方式实现,静音按键值:

public static final int KEYCODE_VOLUME_MUTE     = 164;

注入方式:

KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_VOLUME_MUTE);
InputManager.getInstance().injectInputEvent(key, 0);

或者:

simulateKey(KeyEvent.KEYCODE_VOLUME_MUTE);

public static void simulateKey(final int KeyCode) {
   
    new Thread() {
   
        @Override
        public void run() {
   
            try {
   
                Instrumentation inst = new Instrumentation();
                inst.sendKeyDownUpSync(KeyCode);
            } catch (Exception e) {
   
                Log.e("hello", e.toString());
            }
        }

    }.start();
}

调用流程:
DecorView.java --> PhoneWindow.java --> MediaSessionService.java

窗口监听Key消息的过程省略过,在Input输入系统中已经分析过。

\frameworks\base\services\core\java\com\android\server\media\MediaSessionService.java
dispatchVolumeKeyEvent()
dispatchVolumeKeyEventLocked()

\frameworks\base\services\core\java\com\android\server\audio\AudioService.java
adjustSuggestedStreamVolume()

private void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
            String callingPackage, String caller, int uid) {
   
            
        //省略一部分代码
        //...

		// mute为true
        final boolean isMute = isMuteAdjust(direction);

        ensureValidStreamType(streamType);
        final int resolvedStream = mStreamVolumeAlias[streamType];

        // Play sounds on STREAM_RING only.
        if ((flags & AudioManager.FLAG_PLAY_SOUND) != 0 &&
                resolvedStream != AudioSystem.STREAM_RING) {
   
            flags &= ~AudioManager.FLAG_PLAY_SOUND;
        }

        // For notifications/ring, show the ui before making any adjustments
        // Don't suppress mute/unmute requests
        if (mVolumeController.suppressAdjustment(resolvedStream, flags, isMute)) {
   
            direction = 0;
            flags &= ~AudioManager.FLAG_PLAY_SOUND;
            flags &= ~AudioManager.FLAG_VIBRATE;
            if (DEBUG_VOL) Log.d(TAG, "Volume controller suppressed adjustment");
        }

        adjustStreamVolume(streamType, direction, flags, callingPackage, caller, uid);
}
protected void adjustStreamVolume(int streamType, int direction, int flags,
            String callingPackage, String caller, int uid) {
   
            
        //省略一部分代码
        //...

		    //省略一部分代码
		    //...
			if (isMuteAdjust) {
   
                boolean state;
                if (direction == AudioManager.ADJUST_TOGGLE_MUTE) {
   
                    state = !streamState.mIsMuted;
                } else {
   
                    state = direction == AudioManager.ADJUST_MUTE;
                }
                if (streamTypeAlias == AudioSystem.STREAM_MUSIC) {
   
                    setSystemAudioMute(state
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值