OTA升级后,是不会升级SettingsProvider的值的,比如新版本更改了默认输入法,如果不在代码中做处理,升级后是不会生效的,还是旧版本的输入法。
切换默认输入法原理
Android输入法切换可以在 设置-系统-语言和输入法 中手动选择调整,如下图
以下是2个与输入法相关的配置及adb查看指令
adb shell settings list secure default_input_method
default_input_method=com.baidu.input/com.baidu.input.ImeService
adb shell settings list secure enabled_input_methods
enabled_input_methods=com.baidu.input/com.baidu.input.ImeService
可以知道当前默认输入法是百度输入法。当在设置中打开搜狗输入法并设置为默认输入法后,观察其值变化
default_input_method=com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS
enabled_input_methods=com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS
所以只要修改default_input_method,enabled_input_methods这两个Settings.Secure中的值就可以切换默认输入法。
Settings.Secure中的值存放在/data/system/users/0/settings_secure.xml
Android11此文件未加密,打开是明码,Android12是经过处理的打开是乱码。
OTA升级过程修改默认输入法
一、输入法配置
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<string name="config_default_input_method" translatable="false">com.baidu.input/com.baidu.input.ImeService</string>
<string name="config_enabled_input_method" translatable="false">com.baidu.input/com.baidu.input.ImeService</string>
修改为
<string name="config_default_input_method" translatable="false">com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS</string>
<string name="config_enabled_input_method" translatable="false">com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS</string>
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadSecureSettings函数中添加
loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
R.string.config_default_input_method);
loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
R.string.config_enabled_input_method);
二、OTA升级修改默认输入法
要修改两处
- 修改版本号
- 升级过程更新Settings.Secure值
实测无效的修改法
注意在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 中改是不行的,
试过改DATABASE_VERSION,与onUpgrade函数,在里面对数据进行升级,在OTA后无效。
如下修改是无效的:
diff --git a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 296dfeaf80..11fe3b4791 100755
--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -83,7 +83,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 118;
+ private static final int DATABASE_VERSION = 119;
private Context mContext;
private int mUserHandle;
@@ -1841,6 +1841,24 @@ class DatabaseHelper extends SQLiteOpenHelper {
upgradeVersion = 118;
}
+ if (upgradeVersion < 119) {
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
+ com.android.internal.R.string.config_enabled_input_method);
+ loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
+ com.android.internal.R.string.config_default_input_method);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 119;
+ }
+
正确的修改
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
private static final int SETTINGS_VERSION = 191;
改为
private static final int SETTINGS_VERSION = 192;
onUpgradeLocked函数中,添加
if (currentVersion == 191) {
final SettingsState secureSettings = getSecureSettingsLocked(userId);
secureSettings.insertSettingOverrideableByRestoreLocked(
Settings.Secure.ENABLED_INPUT_METHODS,
getContext().getResources().getString(
R.string.config_enabled_input_method),
null, true, SettingsState.SYSTEM_PACKAGE_NAME);
secureSettings.insertSettingOverrideableByRestoreLocked(
Settings.Secure.DEFAULT_INPUT_METHOD,
getContext().getResources().getString(
R.string.config_default_input_method),
null, true, SettingsState.SYSTEM_PACKAGE_NAME);
currentVersion = 192;
}
相关文章
Android8.1高通平台修改默认输入法
Android SDK删除内置的触宝输入法
Android 13 内置可卸载的搜狗输入法
作者:帅得不敢出门