Android7.0 系统添加默认输入法
需求
将我们自己的输入法加到系统中,并设置成默认输入法。
具体实现
1、将输入法编入系统,一般可以将应用放到package/app/目录下,mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyIME
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apkinclude $(BUILD_PREBUILT)
2、设置为默认输入法,diff如下:
------------ base/packages/SettingsProvider/res/values/defaults.xml ------------
index 9b50dc0..d46038c 1006441
+
+ com.test.myime/.MyIMEService
+ com.test.myime/.MyIMEService
base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 998efd9..fcd5555 100644
@@ -2457,22 +2457,28 @@ class DatabaseHelper extends SQLiteOpenHelper {String wifiWatchList = SystemProperties.get("ro.com.android.wifi-watchlist");if (!TextUtils.isEmpty(wifiWatchList)) {loadSetting(stmt, Settings.Secure.WIFI_WATCHDOG_WATCH_LIST, wifiWatchList);}// Don't do this. The SystemServer will initialize ADB_ENABLED from a// persistent system property instead.//loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);// Allow mock locations default, based on build
+
+ loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
+ R.string.config_default_input_method );
+ loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
+ R.string.config_enable_input_methods );
+loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,"1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);loadSecure35Settings(stmt);loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,R.bool.def_mount_play_notification_snd);loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_AUTOSTART,R.bool.def_mount_ums_autostart);这个修改其实就是让SettingProvider读取配置并加到数据库中,然后由
InputMethodService来加载默认输入法。
bug处理
以上的修改如果是对于6.0系统就已经OK了,但是7.0有不一样的地方。经过分析,原来是当手机已经通电开机但是用户并有解锁锁屏的时候,Android N运行于一个安全的模式,也就是Dierect Boot模式。一般情况下,应用是无法在Direct Boot模式下运行的,如果需要某个app能够在Direct Boot模式下运行,需要注册相关APP的组件。
应用组件申请在Direct Boot模式下运行:在AndroidManinfest.xml中设置 android:directBootAware="true"。
在分析7.0过程中发现在启动Launcher之前会先启动一个FallbackHome,之后才会启动Launcher,通过调查发现FallbackHome属于Settings中的一个activity,Settings的android:directBootAware为true,并且FallbackHome在category中配置:
所以在ActivityManagerService启动Home界面时,从PackageManagerService中获取到的Home界面就是FallbackHome。
这个安全模式就会导致我的输入法在系统起来的时候服务没起来,进而导致输入法弹不出来。
解决方法
在输入法的AndroidManifest.xml中声明android:directBootAware为true。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
