我是靠谱客的博主 小巧芹菜,最近开发中收集的这篇文章主要介绍android电话音量静音的原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

事情是这样的,需求做一个悬浮窗要能够监听到音量按键,在电话响起的时候,死活监听不到,只能够收到一个action=ACTION_UP,表示不能理解,书上可不是这么说的,事件分发可不是这样的,除了什么问题,然后到Dialer看代码怎么写的这么牛逼,还能这么屏蔽掉事件分发?

找了半天没有找到异常的状况,然后找到一句这个东西在OnKeyDown的时候

case KeyEvent.KEYCODE_VOLUME_MUTE:
// Ringer silencing handled by PhoneWindowManager.
break;

这里有句注释,将铃声关闭在PhoneWindowManager里。去看一下找到这么一个方法调用

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)
截取其中的一段代码


 当按键按下的时候,先判断是否是在响铃,如果是在响铃,关掉铃声telecomManager.silenceRinger(),并且加了个Flag    ~ACTION_PASS_TO_USER

if (telecomManager.isRinging()) {
// If an incoming call is ringing, either VOLUME key means
// "silence ringer".
We handle these keys here, rather than
// in the InCallScreen, to make sure we'll respond to them
// even if the InCallScreen hasn't come to the foreground yet.
// Look for the DOWN event here, to agree with the "fallback"
// behavior in the InCallScreen.
Log.i(TAG, "interceptKeyBeforeQueueing:"
+ " VOLUME key-down while ringing: Silence ringer!");
// Silence the ringer.
(It's safe to call this
// even if the ringer has already been silenced.)
telecomManager.silenceRinger();
// And *don't* pass this key thru to the current activity
// (which is probably the InCallScreen.)
result &= ~ACTION_PASS_TO_USER;
break;
}

这个flag是这样的含义

/**
* Pass this event to the user / app.
To be returned from
* {@link #interceptKeyBeforeQueueing}.
*/
public final static int ACTION_PASS_TO_USER = 0x00000001;



将event传递到user/和app ,前面代码加了个取反的flag就是不传递这个事件。 当然在应用层电话想的时候也就收不到了。

所以问题出在PhoneWindowManager上,事件分发的机制还是无问题的。


最后

以上就是小巧芹菜为你收集整理的android电话音量静音的原理的全部内容,希望文章能够帮你解决android电话音量静音的原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部