不同国家,键盘布局不用,其具体的布局是kcm文件中配置的
在\frameworks\base\packages\InputDevices\res\raw下已经有对应的kcm文件,\frameworks\base\packages\InputDevices\res\xml\keyboard_layouts.xml中是这些kcm文件的列表,在framework/base/services/core/java/android/server/input/InputManagerServices.java中已经有去解析keyboard_layouts.xml这个文件,按照InputManagerServices.java ->visitKeyboardLayoutsInPackage这个方法以及 getDefaultKeyboardLayout方法中的实现keyboard_layouts.xml应该要有locale可以与systemLocale匹配的,但实际实现中却没有。肯定知道locale与keyboardlayout的对应规则,或者去哪里可以查阅到这些资料。

解决方案 »

  1.   


    private void visitAllKeyboardLayouts(KeyboardLayoutVisitor visitor) {
            final PackageManager pm = mContext.getPackageManager();
            Intent intent = new Intent(InputManager.ACTION_QUERY_KEYBOARD_LAYOUTS);
            for (ResolveInfo resolveInfo : pm.queryBroadcastReceivers(intent,
                    PackageManager.GET_META_DATA | PackageManager.MATCH_DIRECT_BOOT_AWARE
                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE)) {
                final ActivityInfo activityInfo = resolveInfo.activityInfo;
                final int priority = resolveInfo.priority;
                visitKeyboardLayoutsInPackage(pm, activityInfo, null, priority, visitor);
            }
        }看起来还是挺明显的,需要外部应用提供信息,搜索下github镜像InputDevices/AndroidManifest,剩下应该是你的专职工作我也就不太清楚了。<manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.android.inputdevices"
            coreApp="true"
            android:sharedUserId="android.uid.system">    <application
                android:allowClearUserData="false"
                android:label="@string/app_label"
                android:process="system"
                android:defaultToDeviceProtectedStorage="true"
                android:directBootAware="true">        <receiver android:name=".InputDeviceReceiver"
                    android:label="@string/keyboard_layouts_label">
                <intent-filter>
                    <action android:name="android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS" />
                </intent-filter>
                <meta-data android:name="android.hardware.input.metadata.KEYBOARD_LAYOUTS"
                        android:resource="@xml/keyboard_layouts" />
            </receiver>
        </application>
    </manifest>