做了一年多的ROM定制开发工作,项目上时常会碰到客户要求预置第三方输入法,或者默认勾选某个输入法,甚至默认使用某个输入法的需求。

    默认勾选:就是在所有输入法列表哪里默认勾选某个输入法,勾选中之后,它才会出现在输入法选择的Dialog中。 默认使用:就是在需要输入文本时,默认弹出来的那个输入法。

    一旦涉及到默认勾选,或者默认使用,那就要知道那个输入法的 PackageName 和 ServiceName 了。不管熟不熟悉输入法知识,只要会用DDMS的强大功能,那么 PackageName 就很好搞到了。而这个 ServiceName 可能就让很多不熟悉输入法开发的人懵圈了。

    简单粗暴的方法:反编译,分析 AndroidManifast.xml 文件。

    Apk反编译,AndroidManifast 文件一般都能完整的拿到,这个时候,只需要找 Service 节点即可。

    当然,实际搜Service可能会出来好多结果,一般这个 Service 会有如下几个特点:
    1、会申请 android.permission.BIND_INPUT_METHOD 权限;
    2、会有个Action:android.view.InputMethod;
    3、会有meta-data,里面会指定name:android.view.im,以及一个 resource。

    以触宝输入法为例:

    1. <service android:name="com.cootek.smartinput5.TouchPalIME"
    2. android:permission="android.permission.BIND_INPUT_METHOD">
    3. <intent-filter>
    4. <action android:name="android.view.InputMethod"/>
    5. <category android:name="android.intent.category.DEFAULT"/>
    6. </intent-filter>
    7. <meta-data android:name="android.view.im"
    8. android:resource="@xml/touchpal_method"/>
    9. </service>

    找到这个 Service 之后,接下来就是进行默认操作了。


    以触宝输入法为例
    默认勾选:Settings.Secure.ENABLED_INPUT_METHODS
    在 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 文件加入如下代码:

    1. loadSetting(
    2. stmt,
    3. Settings.Secure.ENABLED_INPUT_METHODS,
    4. "com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME"
    5. );

    默认使用:Settings.Secure.DEFAULT_INPUT_METHOD
    在 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 文件加入如下代码:

    1. loadSetting(
    2. stmt,
    3. Settings.Secure.DEFAULT_INPUT_METHOD,
    4. "com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME"
    5. );