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