栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓11adb控制按键Home和Back和电源短按键的禁用和启用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓11adb控制按键Home和Back和电源短按键的禁用和启用

启用和禁用Home和Back和电源短按键 用什么方法?

如果是按钮的话可以直接拿到enable属性或clickable属性去控制,但安卓11中并没有直接地方拿到按键,而拿到的是ButtonDispatcher,亲测无法直接使用setEnabled()方法,会直接编译报错,如果使用setClickable()又不生效。所以直接通过属性控制是不行的。
那么,就应该考虑按下键位时做了什么事情,想办法拦截下事件。

按键对应keyCode

在keyEvent.java中,有一些按键对应着keyCode,而当keyCode=0时,代表未知的密钥,通过控制keyEvent里面的keyCode,让其返回0,使其按键的事件被系统认定为未知,这样就能把事件拦截下来。
关于路径:

frameworksbasecorejavaandroidviewKeyEvent.java
在哪里控制?
baseservicescorejavacomandroidserverpolicyPhoneWindowManager.java

在PhoneWindowManager.java搜索你需要启用或禁用按键对应的keyCode,一般的写法是KeyEvent.KEYCODE_XXX,而这个值是在KeyEvent.java中被定义好的,比如说KeyEvent.KEYCODE_HOME,在搜索中

这是一个选择语句,我们只要在adb中写入一个值或发送广播之类的,以此多套一层选择语句,让其做为返回0的条件,便可以控制按键的点击事件或触摸长按事件之类的,使其显示状态却不对事件回应。

举个例子----禁用Home按键 找到home按键对应的keyCode
    public static final int KEYCODE_HOME            = 3;
找到处理home键对应keyCode的地方

路径

baseservicescorejavacomandroidserverpolicyPhoneWindowManager.java
// First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {
			
            DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
            if (handler == null) {
                handler = new DisplayHomeButtonHandler(displayId);
                mDisplayHomeButtonHandlers.put(displayId, handler);
            }
            return handler.handleHomeButton(focusedToken, event);
        }
修改方法

这里我采用向系统数据库写入值得方法去控制
首先在数据库中加入我们需要的值的字段
路径:

vendormediatekproprietarypackagesappsSettingsProvidersrccomandroidproviderssettingsDatabaseHelper.java

这个路径只要找SettingsProvider下的DatabaseHelper.java类就好了,因为不同公司的集成路径的叫法不同。
这里要做的就是向settings数据库中三个表之一,写入一个字段并附上对应默认值即可。
如果在loadSystemSettings(SQLiteDatabase db)方法中写入,则是在system表中添加了字段,注意,在写入值时,要与你输入adb命令put值的表对应,否则无效

loadIntegerSetting(stmt,"home_button",R.integer.def_home_button);

这里加入的是一个i整形引用类型的值,需要在此项目的同级目录下中的default.xml中添加好对应的值

 0

回到PhoneWindowManager.java中,则有

 // First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {
		
		
			if(Settings.System.getInt(mContext.getContentResolver(),
                        "home_button", 0) ==1){
				return 0;
			}
			
            DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
            if (handler == null) {
                handler = new DisplayHomeButtonHandler(displayId);
                mDisplayHomeButtonHandlers.put(displayId, handler);
            }
            return handler.handleHomeButton(focusedToken, event);
        }

这里是采用向settings数据库中的system表中写入值来控制home按键的启用和禁用

做好这些后就可以刷机了。

测试方法

在adb命令窗口中,通过

这里我们可以查看system表中的home_button值为0
而代码中我们让home_button值为1时,keyCode返回0

这样我们就修改了home_button的值为1,此刻home按键是失效的。

back和电源短按键可以用同等方式去控制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036740.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号