当前位置: 首页 > news >正文

android设备出厂前 按键测试 快速实现-屏蔽Home,Power等键

android整机测试,需要测试按键。

一般的键好按,好测试。如:音量加+ ,音量- 。

但是,有些按键就不好测了。譬如:电源键(Power),Home键,Menu键,Back键,

以上按键,除了Back可以监听捕捉,其他按键都不好测。

还有特殊按键:F1,F2键。

需要找一个根本的解决方案。

只能从根本上解决这个问题。需要从源码入手。

当进入测试界面的时候,发送一个Intent告诉系统,开始进行按键测试。当离开界面的时候,告诉系统按键测试结束。

具体操作的代码在:

QSSI.13/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public class PhoneWindowManager implements WindowManagerPolicy {
 
         // register for multiuser-relevant broadcasts
         filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
+        filter.addAction(CIT_TEST_ON);
+        filter.addAction(CIT_TEST_OFF);
         context.registerReceiver(mMultiuserReceiver, filter);
 
         mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
@@ -2795,6 +2797,35 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                     + repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);
         }
 
+        if (citTestIn) {
+            switch (keyCode) {
+                case KeyEvent.KEYCODE_HOME:
+                    sendBroadcastIntent(ACTION_HOME);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_MENU:
+                    sendBroadcastIntent(ACTION_MENU);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_POWER:
+                    sendBroadcastIntent(ACTION_POWER);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_BACK:
+                    sendBroadcastIntent(ACTION_BACK);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_KEYF1:
+                    sendBroadcastIntent(ACTION_F1);
+                    if (DEBUG_INPUT) {
+                        Slog.d(TAG, "###########KEYF1###########keyCode: " + keyCode);
+                    }
+                    return key_consumed;
+                case KeyEvent.KEYCODE_KEYF2:
+                    sendBroadcastIntent(ACTION_F2);
+                    if (DEBUG_INPUT) {
+                        Slog.d(TAG, "###########KEYF2###########keyCode: " + keyCode);
+                    }
+                    return key_consumed;
+            }
+        }
+
         if (mKeyCombinationManager.isKeyConsumed(event)) {
             return key_consumed;
         }
@@ -2857,6 +2888,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                 // Hijack modified menu keys for debugging features
                 final int chordBug = KeyEvent.META_SHIFT_ON;
 
+                if (citTestIn) {
+                    sendBroadcastIntent(ACTION_MENU);
+                }
                 if (down && repeatCount == 0) {
                     if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
                         Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
@@ -3773,6 +3807,39 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
         boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                 || event.isWakeKey();
+        int key_consumed = 0;
+        if (DEBUG_INPUT) {
+            Slog.d(TAG, "######################keyCode: " + keyCode);
+        }
+        if (citTestIn) {
+            switch (keyCode) {
+                case KeyEvent.KEYCODE_HOME:
+                    sendBroadcastIntent(ACTION_HOME);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_MENU:
+                case 187:
+                    sendBroadcastIntent(ACTION_MENU);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_POWER:
+                    sendBroadcastIntent(ACTION_POWER);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_BACK:
+                    sendBroadcastIntent(ACTION_BACK);
+                    return key_consumed;
+                case KeyEvent.KEYCODE_KEYF1:
+                    sendBroadcastIntent(ACTION_F1);
+                    if (DEBUG_INPUT) {
+                        Slog.d(TAG, "###########KEYF1###########keyCode: " + keyCode);
+                    }
+                    return key_consumed;
+                case KeyEvent.KEYCODE_KEYF2:
+                    sendBroadcastIntent(ACTION_F2);
+                    if (DEBUG_INPUT) {
+                        Slog.d(TAG, "###########KEYF2###########keyCode: " + keyCode);
+                    }
+                    return key_consumed;
+            }
+        }
 
         if (!mSystemBooted) {
             // If we have not yet booted, don't let key events do anything.
@@ -4592,6 +4659,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             }
         }
     };
+    private boolean citTestIn = false;
+    private String CIT_TEST_ON = "com.aaabbb.citteston";
+    private String CIT_TEST_OFF = "com.aaabbb.cittestoff";
+
+    private String ACTION_HOME = "com.aaabbb.home";
+    private String ACTION_BACK = "com.aaabbb.back";
+    private String ACTION_MENU = "com.aaabbb.menu";
+    private String ACTION_POWER = "com.aaabbb.power";
+    private String ACTION_F1 = "com.aaabbb.f1";
+    private String ACTION_F2 = "com.aaabbb.f2";
 
     BroadcastReceiver mMultiuserReceiver = new BroadcastReceiver() {
         @Override
@@ -4604,10 +4681,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                 mSettingsObserver.onChange(false);
                 mDefaultDisplayRotation.onUserSwitch();
                 mWindowManagerFuncs.onUserSwitched();
+            } else if (intent.getAction().equals(CIT_TEST_ON)) {
+                citTestIn = true;
+            } else if (intent.getAction().equals(CIT_TEST_OFF)) {
+                citTestIn = false;
             }
         }
     };
 
+    private void sendBroadcastIntent(String action) {
+        Intent intent = new Intent(action);
+        mContext.sendBroadcast(intent);
+    }
+
     // Called on the PowerManager's Notifier thread.
     @Override
     public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) {

测试App需要注册一个BroadcastReceiver ,来处理接受到的按键广播。

PhoneWindowManager 要2个地方都要修改,才能覆盖所有的按键要求。menu处理起来复杂些。

http://www.dtcms.com/a/108554.html

相关文章:

  • 群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)
  • 亚马逊云科技携手 DeepSeek:开启企业级生成式 AI 新征程
  • 通信算法之253: 802.16(WiMAX)的FFT-CP长度
  • 力扣HOT100之链表:160. 相交链表
  • MINIQMT学习课程Day1
  • 【操作系统】LinuxRT-Thread查看内存分布的方法
  • 06_docker 网络类型
  • 蓝桥杯 web 学海无涯(axios、ecahrts)版本二
  • tomcat使用笔记、启动失败但是未打印日志
  • ue5 学习笔记 FPS游戏制作35 GameMode与GameInstance
  • 零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
  • MySQL 管理
  • 论文阅读9——更严格的汽车排放标准对气候、健康、农业和经济的影响
  • Redis 慢查询
  • php 扩展库官网
  • 小程序中的网络请求
  • springcouldalibaba5大组件
  • leetcode热题100(2)
  • 在Linux系统上深入安装与配置Redis:从基础到高级的全方位指南
  • LeetCode BFS解决最短路问题
  • 深入浅出:Spring Bean 的初始化流程详解
  • [力扣每日一练]关于特定字符串的匹配
  • Flutter 插件 百度地图 Android插件演示
  • 配置Next.js环境 使用vscode
  • 多元守护,构筑健康生活
  • ClickHouse与Doris对比:数据处理领域的“华山论剑”
  • 制作cass高程点块定义——cad c#二次开发
  • 在QGIS中将矢量数据导出为JSON
  • 运营商在网状态查询API接口如何对接?
  • 【Axure高保真原型】动态柱状图