Android源码中默认的有三种输入法:英文,中文,日文。对应的工程代码路径为:
<android_root>/packages/inputmethods/LatinIME/
<android_root>/packages/inputmethods/OpenWnn/
<android_root>/packages/inputmethods/PinyinIME/

一般情况下,默认都是选择的LatinIME输入法,但是Android系统默认都是选择系统语言作为输入法,比如我们要用中文输入法,
就需要切换系统语言为中文,或不勾选系统语言,主动勾选中文,但是我们怎么修改默认的语言输入法呢?
主要要关注3个模块代码:
(1) Setting源码
(2) SettingsProvider源码
(3) LatinIME输入法源码

方法一:(修改默认输入法语言为英文和泰文,亲测ok)
(1) 修改 packages\inputmethods\LatinIME\java\AndroidManifest.xml,增加

 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <receiver android:name="LatinImeReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

(2) 在packages\inputmethods\LatinIME\java\src\com\android\inputmethod\latin目录增加LatinImeReceiver.java文件,源码如下

package com.android.inputmethod.latin;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.provider.Settings;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import android.text.TextUtils;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager; public class LatinImeReceiver extends BroadcastReceiver {
private static final String TAG = LatinImeReceiver.class.getSimpleName(); private static final String[] DEFAULT_LATIN_IME_LANGUAGES = {"en_US","th"};//默认开启输入法的语言 @Override
public void onReceive(Context context, Intent intent) {
// Set the default input language at the system boot completed. if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Log.i(TAG,"onReceive:ACTION_BOOT_COMPLETED");
SharedPreferences sp = context.getSharedPreferences("default_input_language_config", Context.MODE_PRIVATE);
boolean hasSet = sp.getBoolean("has_set", false); if (!hasSet) {
setDefaultSubtypes(context);
sp.edit().putBoolean("has_set", true).commit();
}
}
} /**
* M: Set the default IME subtype.
*/ private void setDefaultSubtypes(Context context) {
Log.i(TAG,"setDefaultSubtypes");
final String serviceName = "com.android.inputmethod.latin/.LatinIME";
final String currentPackageName = "com.android.inputmethod.latin";
final String enable = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ENABLED_INPUT_METHODS);
Log.i(TAG,"enable="+enable);//com.android.inputmethod.latin/.LatinIME final InputMethodManager imm = (InputMethodManager) context.getSystemService( Context.INPUT_METHOD_SERVICE);
final StringBuilder builder = new StringBuilder(); // Get sub type hash code
for (InputMethodInfo info : imm.getInputMethodList()) {
if (currentPackageName.equals(info.getPackageName())) {
Log.i(TAG,"info.getSubtypeCount()="+info.getSubtypeCount());//
for (int i = 0; i < info.getSubtypeCount(); i++) {
final InputMethodSubtype subtype = info.getSubtypeAt(i);
final String locale = subtype.getLocale().toString();
Log.i(TAG,"locale="+locale);
if (isDefaultLocale(locale)) {
Log.i(TAG, "default enabled subtype locale = " + locale);
builder.append(';');
builder.append(subtype.hashCode());
}
}
break;
}
} // Insert the sub type
if (builder.length() > 0 && !TextUtils.isEmpty(enable)) {
final String subtype = builder.toString();
builder.setLength(0);
final int index = enable.indexOf(serviceName) + serviceName.length(); if (enable.length() > index) {
builder.append(enable.substring(0, index));
builder.append(subtype);
builder.append(enable.substring(index));
} else if (enable.length() == index) {
builder.append(enable);
builder.append(subtype);
} else {
return;
}
}
else {
Log.w(TAG, "Build Latin IME subtype failed: " + " builder length = " + builder.length() +
"; enable isEmpty :" + TextUtils.isEmpty(enable));
return;
} /*android/packages/inputmethods/LatinIME/java/res/xml/method.xml
-921088104;529847764分别代表en_US和th
*/
Log.i(TAG,"commoit:"+builder.toString());//com.android.inputmethod.latin/.LatinIME;-921088104;529847764 // Commit the result
android.provider.Settings.Secure.putString(context.getContentResolver(),
android.provider.Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
String lastInputMethodId = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.DEFAULT_INPUT_METHOD);
Log.w(TAG, "DEFAULT_INPUT_METHOD = " + lastInputMethodId); //com.android.inputmethod.latin/.LatinIME if(lastInputMethodId.equals(serviceName)) {
Log.w(TAG, "DEFAULT_INPUT_METHOD = com.android.inputmethod.latin/.LatinIME" ); for (InputMethodInfo info : imm.getInputMethodList()) {
if (currentPackageName.equals(info.getPackageName())) {
for (int i = 0; i < info.getSubtypeCount(); i++) {
final InputMethodSubtype subtype = info.getSubtypeAt(i);
final String[] locales = DEFAULT_LATIN_IME_LANGUAGES;
Log.w(TAG, "i = " + i + ", locales[0] = " + locales[0]);
if((subtype.getLocale()).equals(locales[0])) {
Log.w(TAG, "putString " + subtype.hashCode());
android.provider.Settings.Secure.putInt(context.getContentResolver(),
android.provider.Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, subtype.hashCode());
}
}
}
}
}
} /**
* M: Check if the current locale is default or not.
*/
private boolean isDefaultLocale (String locale) {
final String[] locales = DEFAULT_LATIN_IME_LANGUAGES; for (String s : locales) {
if (s.equals(locale)) {
return true;
}
} return false;
} }

方法二:
还有一种修改方案:(在amlogic验证是OK的)
(1) 首先frameworks\base\packages\SettingsProvider\res\values\defaults.xml 增加下面语句
<string name="def_input_methods">com.android.inputmethod.latin/.LatinIME;529847764;-921088104</string>

意思是增加英文和泰文输入法,android/packages/inputmethods/LatinIME/java/res/xml/method.xml中有定义的
-921088104;529847764分别代表en_US和th

(2) 然后在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
增加如下代码
loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS, R.string.def_input_methods);

frameworks/base/packages/SettingsProvider的作用
我们在调用android.provider.Settings修改一些设置时,Settings会调用真正的SettingsProvider去访问数据库。
android把SettingsProvider的代码放在了frameworks/base/packages下面。

Android framework系统默认设置修改
修改Settings源码可修改系统设置项,Settings数据被存放于com.android.providers.settings/databases/settings.db 中,如果想修改系统启动后加载的默认值,一种方法是直接修改settings.db的值,另一种就是修改SettingsProvider默认值
Settings应用能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,
那么第一次开机的时候这些数据都是从哪儿来的呢?
frameworks/base/packages/SettingsProvider/res/values/defaults.xml这个文件就是用来存储Android系统的默认设置
如果想定义defaults.xml中没有的,在这里添加后,需修改frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java,加入自己的存储代码。
例如:
600000设置关屏超时时间的默认值
102 设置亮度的默认值
false设置是否允许安装非Market应用程序的默认值

参考:
Android的语言设置(一)
http://blog.csdn.net/seker_xinjian/article/details/6288957

Latin输入法怎么默认勾选几种语言
http://wenku.baidu.com/link?url=gAscqnKoMNOi_wzR3LEsk9kw-Hsp6k-hkWsW3_Jvyz3SmMXkENODD6XjRtS9BrndAS4iY2IuM8nQaxj05J4NUmBFdFE5-7nl9P9bVIwqfCm

Android framework系统默认设置修改
http://blog.csdn.net/tiantian715/article/details/7739294

在android settings.db数据库中添加一项新的设置
http://www.2cto.com/kf/201303/198067.html

Android默认输入法语言的修改以及SettingsProvider作用的更多相关文章

  1. Android默认系统声音/大小修改及配置【转】

    本文转载自:http://blog.csdn.net/a8316124/article/details/60574859 在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知 ...

  2. Android 如何修改默认输入法

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  3. Android系统默认输入法的修改为搜狗输入法

    1.  frameworks\base\packages\SettingsProvider\res\values\defaults.xml 文件中修改默认输入法为搜狗输入法 <stringnam ...

  4. android修改默认输入法

    方案一:adb命令设置?方案2:系统配置:方案3:调用系统API接口设置---------------------------adb shell cmdadb rootadb remountadb p ...

  5. Android 9.0 添加预置第三方输入法/设置默认输入法(软键盘)

    前言 在一些Android项目中往往需要预置第三方输入法或自己的输入法,这篇文章就简单讲解如何预置第三方输入法apk及设置默认输入法 结果展示 在介绍基本的调整方法前,先看看效果图, 如下 调整方法 ...

  6. 修改Android默认背光值

    /********************************************************************* * 修改Android默认背光值 * 说明: * 本文主要 ...

  7. MTK Android 默认值修改笔记

    1.设置菜单: 1.1位置信息(Location)默认关闭: 请将 alps\frameworks\base\packages\SettingsProvider\res\values\default. ...

  8. ADB命令后台修改系统默认输入法

    今天要研究uiautomator如何输入中文,看网上有一种常用的解决办法:http://www.cnblogs.com/yajing-zh/p/5125387.html在这篇博客最后提出来的问题,也是 ...

  9. 如何修改mtk android 默认拍照size

    [DESCRIPTION] 修改默认拍照size [SOLUTION] 修改默认的capture size,改变camera feature table的FID_CAP_SIZE default值不起 ...

随机推荐

  1. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  2. WINDOWS-API:关于线程 GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

    {返回当前线程的虚拟句柄} GetCurrentThread: THandle; {返回当前线程 ID} GetCurrentThreadId: DWORD; {返回当前进程的虚拟句柄} GetCur ...

  3. C++链表简单的应用

    学生管理系统,输入学生的姓名和学号,然后再输出: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib ...

  4. idea中pom.xml没有工作 IDEA中maven项目pom.xml依赖不生效解决

    问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...

  5. C07 模块化开发信息管理系统案例

    目录 需求分析 问题分析 开发阶段 需求分析 总体需求 学员信息管理系统支持以下功能 增加学员信息功能 删除学员信息功能 查询学员信息功能 修改学员信息功能 输出所有学员信息功能 退出系统 其他需求 ...

  6. CornerStone使用跳坑总结

    Cornerstone是专门为Mac用户设计的Subversion(SVN)的控制,使版本控制更加透明.cornerstone根Xcode相比,能够更好的忽略文件,所以除了项目经理第一次初始化项目的时 ...

  7. linux交换分区调整

      SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用.它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且 ...

  8. LeetCode之螺旋矩阵

    问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...

  9. destoon 支付异步接口文件 notify.php 调试方式

    在if($verify_result) { 之前复制这三个变量 就可以直接访问notify.php 启用调试模式 或者 逐步echo 相关变量来调试 错误原因   notify.php没有入口文件 是 ...

  10. NoSQL 数据库之MongoDB

    1.MongoDB简介 1.1什么是MongoDB MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当 ...