【AndroidFramework】ATV9遥控器红外模式下,机顶盒在假待机阶段会响应遥控器语音键
【问题描述】
测试部反馈,红外模式下,按power键进入假待机,按红外语音键会唤醒。
背景交代:红外语言键是我们自定义的按键,键值225。在红外模式下按会弹提示框“没连蓝牙,请连蓝牙使用语音键
【问题结论】
不是问题,这是Android框架源码中的功能设定,鉴于我们不修改ATV9的框架,所以该问题非故障处理。测试方法异常。
【分析详细】
android9按键打印没开,需要修改框架代码打开日志打印。
路径:Android9.0-SDK/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
打开打印:
static final String TAG = "WindowManager";
static final boolean DEBUG_INPUT = true;//在这里,默认是false的,我们将它改为true,打开打印。
打印主要看下面两个函数。
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
+ repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed
+ " canceled=" + canceled);
}
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTq keycode=" + keyCode
+ " interactive=" + interactive + " keyguardActive=" + keyguardActive
+ " policyFlags=" + Integer.toHexString(policyFlags));
}
加了打印之后待机按键--->>语音按键,实验:
console:/ # [ 227.863558@1] input: irdec, power_state: 1, power_key_state: 0
05-28 04:03:47.865 3115 3179 D WindowManager: interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
05-28 04:03:48.065 3115 3179 D WindowManager: interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
05-28 04:03:48.065 3115 3179 D WindowManager: powerPress: eventTime=227819 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
======
05-28 04:03:50.046 3115 3179 D WindowManager: interceptKeyTq keycode=225 interactive=false keyguardActive=false policyFlags=2000000
console:/ # 05-28 04:03:50.121 3115 3179 D WindowManager: interceptKeyTq keycode=225 interactive=true keyguardActive=false policyFlags=22000000
以上结果表明,框架层的phonewindowmanager是可以收到按键的,说明底层到框架没问题
所以目前的方向:查找按键从框架去了哪?
Q1.global key:是不是走了设置?
A:假待机状态,setting是不在的,遂排除。
Q2.框架其他部分处理了该按键,引起唤醒?
A:分析
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
======
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
======
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
}
以及 frameworks\base\core\java\android\view\KeyEvent.java
/** @hide */
public static final boolean isWakeKey(int keyCode) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_WAKEUP:
case KeyEvent.KEYCODE_PAIRING:
case KeyEvent.KEYCODE_STEM_1:
case KeyEvent.KEYCODE_STEM_2:
case KeyEvent.KEYCODE_STEM_3:
return true;
}
return false;
}
在代码中可确认,是由于框架中原生代码就是设定paring按键是可唤醒键,问题基本澄清,现在将phonewindowmanager加打印验证。
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
Log.d(TAG, "line:6105,whz,voice key is global key & wakekey and going to wake up" );
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
if (isWakeKey) {
Log.d(TAG, "line:6422,whz, is wakekey and going to wake up" );
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
加打印后的验证日志:
console:/sdcard # logcat -c && logcat -v time -s WindowManager
--------- beginning of main
--------- beginning of system
1.按power键进入假待机:
[ 312.423757@1] input: irdec, power_state: 1, power_key_state: 0
01-01 03:06:40.199 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:40.199 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:40.401 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:40.402 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:40.402 D/WindowManager( 3123): powerPress: eventTime=312377 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
2.按BACK键:唤醒了
01-01 03:06:43.025 D/WindowManager( 3123): interceptKeyTq keycode=4 interactive=false keyguardActive=false policyFlags=2000000
01-01 03:06:43.025 D/WindowManager( 3123): boolean isWakeKey =true
01-01 03:06:43.026 D/WindowManager( 3123): line:6422,whz, is wakekey and going to wake up
01-01 03:06:43.229 D/WindowManager( 3123): interceptKeyTq keycode=4 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:43.229 D/WindowManager( 3123): boolean isWakeKey =true
3.再次按Power键进入假待机:
[ 318.426929@1] input: irdec, power_state: 1, power_key_state: 0
01-01 03:06:46.202 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:46.202 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:46.405 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:46.406 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:46.406 D/WindowManager( 3123): powerPress: eventTime=318380 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
4.按语音键:也唤醒了,并且走的是globalkey&&iswakekey
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
======
01-01 03:06:49.168 D/WindowManager( 3123): interceptKeyTq keycode=225 interactive=false keyguardActive=false policyFlags=2000000
01-01 03:06:49.168 D/WindowManager( 3123): boolean isWakeKey =true
01-01 03:06:49.168 D/WindowManager( 3123): line:6105,whz,voice key is global key & wakekey and going to wake up
01-01 03:06:49.249 D/WindowManager( 3123): interceptKeyTq keycode=225 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:49.250 D/WindowManager( 3123): boolean isWakeKey =true
【AndroidFramework】ATV9遥控器红外模式下,机顶盒在假待机阶段会响应遥控器语音键的更多相关文章
- 微软Azure 经典模式下创建内部负载均衡(ILB)
微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...
- 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转
昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...
- win10 下visual studio 2015 在调试模式下不能跟踪源文件
win10 下visual studio 2015 在调试模式下不能跟踪源文件,只要一调试就会关闭(隐藏)打开的文档,非常不方便.经过一番折腾,发现是配置的问题. 如果安装多个版本的VS,请删除对应版 ...
- 转:IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
IE兼容模式下 SCRIPT1028: 缺少标识符.字符串或数字例如下面一段代码 var a = { x: 1, y: 2,};alert(a.x);如果在IE的兼容性视图(IE7文档模式 ...
- 【配置】检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。
× 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 5 ...
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...
- MVC开发模式下的用户角色权限控制
前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...
- TreeView 使用方法:(在View.Details模式下)
1.建立TreeView的標題 2.建立TreeView的Item 3.在TreeView的Item中的建立SubItem 如果將各部 ...
- Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?
构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...
随机推荐
- PHP7.2 、git、swoole安装
一.安装php 1.安装gcc yum -y install gcc gcc-c++ 2.安装一些库 yum -y install php-mcrypt libmcrypt-devel libxml2 ...
- 204-基于Xilinx Virtex-6 XC6VLX240T 和TI DSP TMS320C6678的信号处理板
基于Xilinx Virtex-6 XC6VLX240T 和TI DSP TMS320C6678的信号处理板 1.板卡概述 板卡由我公司自主研发,基于VPX架构,主体芯片为两片 TI DSP TMS ...
- AtCoder Beginner Contest 088 D Grid Repainting
Problem statement We have an H×W grid whose squares are painted black or white. The square at the i- ...
- libevent 网络库安装
./configure prefix=/tools/libevent make sudo make install
- vue2.0 之 slot 内容分发
前提:父组件模板的内容在父组件作用域内编译:子组件模板的内容在子组件作用域内编译.被分发的内容会在父作用域内编译. 一.单个插槽 // 子组件模板 child-component <div> ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- 数据库JDBC
数据库概述 什么是数据库?数据库就是存储数据的仓库,本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库进行增删改查操作. 数据库对应一个应用系统,在系统中有很多的功能,每 ...
- 1.使用kubeadm安装kubernetes
一.环境准备 所有规划主机(一台master,两台node)均需操作 1.关闭防火墙,selinux [root@node1 ~]# systemctl stop firewalld [root@no ...
- web测试方法小结----以便于测试用例
今天在整理电脑的时候,发现一些之前总结过得web 测试的一些方法,以便于写测试用例.现在整理一下,就当复习一下软件测试基础. 一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数 ...
- 【NOIP2016提高组A组7.16】第三条跑道
题目 数据范围 分析 时限5000ms. 我们注意到\(a_{i}初始值以及x小于等于600且非零\) 也就是说,\(a_{i}\)的质因数一定小于600,而600以内的质因数只有109个. 那么考虑 ...