设置-实体键盘-使用屏幕键盘-默认打开
提示:Android-设置-实体键盘-使用屏幕键盘-默认打开
文章目录
- 前言-需求-场景
- 一、参考资料
- 二、修改文件
- 三、实现方案
- 四、源码解读
- [五、开启、关闭 屏幕键盘核心区别和适用场景:](#五、开启、关闭 屏幕键盘核心区别和适用场景:)
- 总结
前言-需求-场景
使用场景:
使用USB外接键盘 可能实际到兼容性问题、功能、符号补充等;使用遥控器场景,肯定需要软键盘的
需求:默认打开使用屏幕键盘功能

一、参考资料
Android 13 默认打开 使用屏幕键盘
MT8390 Android12 默认使用软键盘
Android 13 默认打开 使用屏幕键盘
AOSP ~ 默认属性值
以前属性相关笔记:
Android 系统属性添加篇
Framework 层Settings.System, Settings.Secure和Settings.Global存储及应用
二、修改文件
以MTK 平台为例,修改文件路径: /vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml
三、实现方案
属性:def_show_ime_with_hard_keyboard 设置为ture
java
<!-- Default for Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD -->
<bool name="def_show_ime_with_hard_keyboard">true</bool>
四、源码解读
1、实体键盘页面-PhysicalKeyboardFragment
常规方法,进入实体键盘,查看日志打印:


2、实体键盘页面布局-physical_keyboard_settings
查看 布局文件,如下:

3、再次分析界面-PhysicalKeyboardFragment

所以最终的开关UI是 mShowVirtualKeyboardSwitch
设置监听-mShowVirtualKeyboardSwitchPreferenceChangeListener
java
@Override
public void onResume() {
super.onResume();
mLastHardKeyboards.clear();
scheduleUpdateHardKeyboards();
mIm.registerInputDeviceListener(this, null);
mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener(
mShowVirtualKeyboardSwitchPreferenceChangeListener);
registerShowVirtualKeyboardSettingsObserver();
}
监听中根据系统属性设置开关状态-SHOW_IME_WITH_HARD_KEYBOARD
java
//设置属性值
private final OnPreferenceChangeListener mShowVirtualKeyboardSwitchPreferenceChangeListener =
(preference, newValue) -> {
Secure.putInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD,
((Boolean) newValue) ? 1 : 0);
return true;
};
// 监听属性值并更新开关UI状态
private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
@Override
public void onChange(boolean selfChange) {
updateShowVirtualKeyboardSwitch();
}
};
更新UI组件开关状态-根据属性-updateShowVirtualKeyboardSwitch
java
private void updateShowVirtualKeyboardSwitch() {
mShowVirtualKeyboardSwitch.setChecked(
Secure.getInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0);
}
4、属性值-Secure.SHOW_IME_WITH_HARD_KEYBOARD
既然已经分析到了属性值,那么属性Secure.SHOW_IME_WITH_HARD_KEYBOARD 到底是什么,搞清楚了就去默认一个属性值不就可以了嘛。
这里 : 借鉴以前的资料 笔记:Framework 层Settings.System, Settings.Secure和Settings.Global存储及应用,查找实际值:

五、开启、关闭 屏幕键盘核心区别和适用场景:
下面的对比表格清晰地展示了两者的核心区别和适用场景:
| 特性 | 开启屏幕键盘 (与实体键盘共存) | 关闭屏幕键盘 (仅用实体键盘) |
|---|---|---|
| 核心作用 | 作为实体键盘的功能补充和应急备用 | 获得纯粹、高效的实体键盘输入体验 |
| 输入方式 | 实体键盘 + 触摸/点击屏幕键盘 | 仅通过实体键盘 |
| 最佳使用场景 | 1. 输入表情符号、颜文字、特殊符号 ;2. 使用滑动输入、语音输入 ;3. 实体键盘临时兼容性问题;4. 快速切换多语言 | 1. 长时间文字工作(写作、编程);2. 需要完整屏幕视野(阅读、编辑);3. 连接游戏手柄等外设时避免遮挡 |
| 优点 | 功能全面,兼顾效率与灵活 | 界面干净,无遮挡,专注度高,误触少 |
| 缺点 | 屏幕底部被占用,可能误触 | 无法使用触摸输入特有的便捷功能 |
总结
- 这其实就是一个简单的设置 相关的功能默认需求
- 还是建议从源码角度来看更改,了解、熟悉源码、把流程走一遍会有一定的收获,后续研发写代码也会有一定的经验参考
- 多总结、多学习,和前面知识点形成闭环吧