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

启用和禁用Home和Back和电源短按键

用什么方法?

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

按键对应keyCode

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

frameworks\base\core\java\android\view\KeyEvent.java

在哪里控制?

base\services\core\java\com\android\server\policy\PhoneWindowManager.java

在PhoneWindowManager.java搜索你需要启用或禁用按键对应的keyCode,一般的写法是KeyEvent.KEYCODE_XXX,而这个值是在KeyEvent.java中被定义好的,比如说KeyEvent.KEYCODE_HOME,在搜索中
在这里插入图片描述
这是一个选择语句,我们只要在adb中写入一个值或发送广播之类的,以此多套一层选择语句,让其做为返回0的条件,便可以控制按键的点击事件或触摸长按事件之类的,使其显示状态却不对事件回应。

举个例子----禁用Home按键

找到home按键对应的keyCode

/** Key code constant: Home key.
     * This key is handled by the framework and is never delivered to applications. */
    public static final int KEYCODE_HOME            = 3;

找到处理home键对应keyCode的地方

路径

base\services\core\java\com\android\server\policy\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) {
			
            DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
            if (handler == null) {
                handler = new DisplayHomeButtonHandler(displayId);
                mDisplayHomeButtonHandlers.put(displayId, handler);
            }
            return handler.handleHomeButton(focusedToken, event);
        }

修改方法

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

vendor\mediatek\proprietary\packages\apps\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

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

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

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

 <integer name="def_home_button">0</integer>

回到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和电源短按键可以用同等方式去控制

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值