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

Android 实体键盘 设置默认布局

外界实体物理键盘,需要选择键盘布局,不然会对应输入不正确,某些平台是这样的。

实体键盘在插入设备中后会自动设置一个布局,但是可能不是我们想要的。

修改两个功能:
根据系统语言设置默认的键盘。

默认添加两个键盘布局到'选择键盘布局' 的dialog界面

键盘的布局文件apk位置:  

frameworks/base/packages/InputDevices/res/raw/

frameworks/base/packages/InputDevices/res/xml/keyboard_layouts.xml

追查设置中的布局找到这里,选择键盘布局的Dialog,packages/apps/Settings/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java

点击设置键盘布局,会走到  packages/apps/Settings/src/com/android/settings/inputmethod/KeyboardLayoutPickerController.java

查看到 addKeyboardLayoutForInputDevice 设置键盘布局,所以利用这里我们添加。

@Overridepublic boolean handlePreferenceTreeClick(Preference preference) {if(DEBUG)Log.d("testkeyboard","----handlePreferenceTreeClick---");if (!(preference instanceof SwitchPreference)) {return false;}final SwitchPreference switchPref = (SwitchPreference) preference;final KeyboardLayout layout = mPreferenceMap.get(switchPref);if (layout != null) {final boolean checked = switchPref.isChecked();if (checked) {mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier,layout.getDescriptor());if(DEBUG)Log.d("testkeyboard","layout.getDescriptor() = " + layout.getDescriptor());} else {mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier,layout.getDescriptor());}}return true;}

主要修改 frameworks/base/services/core/java/com/android/server/input/InputManagerService.java 

addKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,String keyboardLayoutDescriptor)

如下修改:

diff --git a/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java b/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
index 5fc3712d221..1bc1ee6cef7 100755
--- a/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
@@ -1101,6 +1101,7 @@ public class InputManagerService extends IInputManager.StubString layout =getCurrentKeyboardLayoutForInputDevice(inputDevice.getIdentifier());if (layout == null) {
+                    if(DEBUG) Slog.d("testkeyboard", "---goto--getDefaultKeyboardLayout");layout = getDefaultKeyboardLayout(inputDevice);if (layout != null) {setCurrentKeyboardLayoutForInputDevice(
@@ -1134,6 +1135,20 @@ public class InputManagerService extends IInputManager.Stubfinal Locale systemLocale = mContext.getResources().getConfiguration().locale;// If our locale doesn't have a language for some reason, then we don't really have a// reasonable default.
+
+        if(DEBUG) Slog.d("testkeyboard", "---getDefaultKeyboardLayout---getLanguage="+systemLocale.getLanguage());
+        String russuan = "com.android.inputdevices/com.android.inputdevices.InputDeviceReceiver/keyboard_layout_russian";
+        String english_us = "com.android.inputdevices/com.android.inputdevices.InputDeviceReceiver/keyboard_layout_english_us";//根据语言设置当前键盘
+        if(systemLocale.getLanguage().equals("en")){
+            return english_us;
+        }
+        if(systemLocale.getLanguage().equals("ru")){
+            return russuan;
+        }
+        //这里就是添加的两个键盘
+        addKeyboardLayoutForInputDevice(d.getIdentifier(),russuan);
+        addKeyboardLayoutForInputDevice(d.getIdentifier(),english_us);
+if (TextUtils.isEmpty(systemLocale.getLanguage())) {return null;}
@@ -1150,6 +1165,7 @@ public class InputManagerService extends IInputManager.Stubfor (int localeIndex = 0; localeIndex < numLocales; ++localeIndex) {if (isCompatibleLocale(systemLocale, locales.get(localeIndex))) {layouts.add(layout);
+                    if(DEBUG) Slog.d("testkeyboard", "---getDefaultKeyboardLayout---for--getLanguage="+systemLocale.getLanguage());break;}}
@@ -1386,10 +1402,12 @@ public class InputManagerService extends IInputManager.Stub@Override // Binder callpublic KeyboardLayout[] getKeyboardLayoutsForInputDevice(final InputDeviceIdentifier identifier) {
+        if(DEBUG) Slog.d("testkeyboard", "---getKeyboardLayoutsForInputDevice---");final String[] enabledLayoutDescriptors =getEnabledKeyboardLayoutsForInputDevice(identifier);final ArrayList<KeyboardLayout> enabledLayouts =new ArrayList<>(enabledLayoutDescriptors.length);
+        if(DEBUG) Slog.d("testkeyboard", "---ArrayList enabledLayouts---");final ArrayList<KeyboardLayout> potentialLayouts = new ArrayList<>();visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {boolean mHasSeenDeviceSpecificLayout;
@@ -1402,6 +1420,7 @@ public class InputManagerService extends IInputManager.Stubfor (String s : enabledLayoutDescriptors) {if (s != null && s.equals(layout.getDescriptor())) {enabledLayouts.add(layout);
+                        if(DEBUG) Slog.d("testkeyboard", "---ArrayList enabledLayouts.add---");return;}}
@@ -1436,8 +1455,10 @@ public class InputManagerService extends IInputManager.Stubpublic KeyboardLayout getKeyboardLayout(String keyboardLayoutDescriptor) {Objects.requireNonNull(keyboardLayoutDescriptor,"keyboardLayoutDescriptor must not be null");
+        if(DEBUG) Slog.d("testkeyboard", "---getKeyboardLayout---keyboardLayoutDescriptor="+keyboardLayoutDescriptor);final KeyboardLayout[] result = new KeyboardLayout[1];
+        if(result!=null) Slog.d("testkeyboard", "---getKeyboardLayout---result.length="+result.length);visitKeyboardLayout(keyboardLayoutDescriptor,(resources, keyboardLayoutResId, layout) -> result[0] = layout);if (result[0] == null) {
@@ -1632,12 +1653,15 @@ public class InputManagerService extends IInputManager.Stub@Override // Binder callpublic String[] getEnabledKeyboardLayoutsForInputDevice(InputDeviceIdentifier identifier) {String key = getLayoutDescriptor(identifier);
+        if(DEBUG) Slog.d("testkeyboard", "---getEnabledKeyboardLayoutsForInputDevice---key="+key);synchronized (mDataStore) {String[] layouts = mDataStore.getKeyboardLayouts(key);
+            if(DEBUG) Slog.d("testkeyboard", "---getEnabledKeyboardLayoutsForInputDevice---getDescriptor="+identifier.getDescriptor());if ((layouts == null || layouts.length == 0)&& !key.equals(identifier.getDescriptor())) {layouts = mDataStore.getKeyboardLayouts(identifier.getDescriptor());}
+            if(DEBUG) Slog.d("testkeyboard", "---getEnabledKeyboardLayoutsForInputDevice---length="+layouts.length);return layouts;}}
@@ -1645,6 +1669,7 @@ public class InputManagerService extends IInputManager.Stub@Override // Binder callpublic void addKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,String keyboardLayoutDescriptor) {
+        if(DEBUG) Slog.d("testkeyboard", "---addKeyboardLayoutForInputDevice---keyboardLayoutDescriptor="+keyboardLayoutDescriptor);if (!checkCallingPermission(android.Manifest.permission.SET_KEYBOARD_LAYOUT,"addKeyboardLayoutForInputDevice()")) {throw new SecurityException("Requires SET_KEYBOARD_LAYOUT permission");
@@ -1653,6 +1678,7 @@ public class InputManagerService extends IInputManager.Stub"keyboardLayoutDescriptor must not be null");String key = getLayoutDescriptor(identifier);
+        if(DEBUG) Slog.d("testkeyboard", "---addKeyboardLayoutForInputDevice---key="+key);synchronized (mDataStore) {try {String oldLayout = mDataStore.getCurrentKeyboardLayout(key);

相关文章:

  • LX-YST-1
  • BeckHoff_FB --> F_SEQ_X3_TrigJob 函数
  • 快速掌握Django框架设计思想(图解版)
  • 用数学融智学人力资源模型的核心架构:建立可量化的理论框架
  • Snipaste:一款简单强大的跨平台截图工具
  • 高并发场景下接口安全实现方案:全方位构建防护体系
  • Linux环境下安装和使用RAPIDS平台的cudf和cuml - pip 安装方法
  • HarmonyOS应用开发——线性布局
  • MongoDB详细安装步骤(Windows 系统)
  • 安卓开发常用框架与库详解
  • 在职申硕|中南财院校专业直选
  • Java性能问题排查
  • 上传视频报错 413 Request Entity Too Large
  • 【动手学深度学习】3.5. 图像分类数据集
  • Python 高级主题与性能优化指南
  • 体系结构论文(八十六):The Dark Side ofComputing: SilentData Corruptions
  • C++ —— STL容器 —— string的模拟实现
  • 北京大学:AI+Agent与Agentic+AI的原理与应用(适合科研从业者和技术爱好者阅读)
  • 功能测试—软件的生命周期
  • 单 exe 截图软件:ScreenCapture 2.3.1 发布
  • 大连做企业网站哪家好/宜兴网站建设
  • 北京网站建设企业网站制作/优化培训学校
  • 辽宁省网站备案系统/怎么免费给自己建网站
  • 通辽做网站建设/什么是百度竞价排名服务
  • 太原建设工程信息网/seo技术建站
  • 做网站那家好/推广软件平台