Android默认输入法语言的修改以及SettingsProvider作用

2024-09-05 09:32

本文主要是介绍Android默认输入法语言的修改以及SettingsProvider作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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"};//默认开启输入法的语言
    @Overridepublic 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/.LatinIMEfinal InputMethodManager imm = (InputMethodManager) context.getSystemService( Context.INPUT_METHOD_SERVICE);final StringBuilder builder = new StringBuilder();// Get sub type hash codefor (InputMethodInfo info : imm.getInputMethodList()) {if (currentPackageName.equals(info.getPackageName())) {Log.i(TAG,"info.getSubtypeCount()="+info.getSubtypeCount());//55for (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/.LatinIMEif(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作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138573

相关文章

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return