前两种为应用内部处理,第三种为发送广播由系统服务进行处理
使用反射
这种会直接将安卓设置内的语言列表清空,然后将选择的语言设置为系统语言
该方法存在问题,在首次开机后设置会导致国外应用进不去(只对于here地图个别版本)
没有问题,经过排查为国家语言代码错误导致的应用无法进入
事实证明,不要太相信度娘,还是得看源码文件找对应的语言代码!!!!!
吃一堑,长一智orz…
/**
* 设置语言,使用反射
* @param mLocale CHINESE ENGLISH
*/
public void setLanguage(Locale mLocale) {
try {
Class localPicker = Class.forName("com.android.internal.app.LocalePicker");
Method updateLocale = localPicker.getDeclaredMethod("updateLocale",
Locale.class);
updateLocale.invoke(null,mLocale);
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException
| IllegalAccessException e) {
e.printStackTrace();
}
}
如果有framework的jar包支持,就可以直接调用,不用再反射,例如在安卓设置中新增功能时,就可以直接调用
LocalePicker.updateLocale(mLocale);
更新语言列表方式
参考安卓设置方法进行移植,该方法需要系统的framework的jar包支持
/*
** 获取系统语言列表,并将选择的语言加入进去
*/
private List<LocaleStore.LocaleInfo> getUserLocaleList(Context context) {
final List<LocaleStore.LocaleInfo> result = new ArrayList<>();
final LocaleList localeList = LocalePicker.getLocales();
for (int i = 0; i < localeList.size(); i++) {
//判断列表中是否有重复项,如有,略过
Locale locale = localeList.get(i);
if (locale.getLanguage().equals("en")) {
continue;
}
result.add(LocaleStore.getLocaleInfo(locale));
}
Locale mLocale = new Locale("en","EN");
result.add(0,LocaleStore.getLocaleInfo(Locale.ENGLISH));
return result;
}
调用
List<LocaleStore.LocaleInfo> mFeedItemList = getUserLocaleList(getApplicationContext());
int count = mFeedItemList.size();
Locale[] newList = new Locale[count];
for (int i = 0; i < count; i++) {
final LocaleStore.LocaleInfo li = mFeedItemList.get(i);
newList[i] = li.getLocale();
}
LocaleList ll = new LocaleList(newList);
LocaleList.setDefault(ll);
LocalePicker.updateLocales(ll);
系统服务进行处理
- 参考系统恢复默认设置处理
try {
IActivityManager am = ActivityManagerNative.getDefault();
Configuration config = am.getConfiguration();
config.locale = mCurrentLocale;
config.userSetLocale = true;
am.updateConfiguration(config);
} catch (android.os.RemoteException e) {
e.printStackTrace();
}
系统/安卓设置内流程
- 流程未研究,待定
该条目参考文章:
Android Settings(设置)语言的切换和添加原理流程简析
语言代码
//英文 简体中文 俄语 西班牙语 越南语 韩语 土耳其语 意大利语 葡萄牙语
private final String[] mConuntry = {"en","zh","ru","es","vi","ko","tr","it","pt"};
private final String[] mCode = {"US","CN","RU","ES","VN","KR","TR","IT","BR"};