1、在拨号盘增加指令输入
vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\dialer\dialpadview\SpecialCharSequenceMgr.java
public static boolean handleChars(Context context, String input, EditText textField) {
// get rid of the separators so that the string gets parsed correctly
String dialString = PhoneNumberUtils.stripSeparators(input);
if (handleDeviceIdDisplay(context, dialString)
|| handleRegulatoryInfoDisplay(context, dialString)
|| handlePinEntry(context, dialString)
|| handleAdnEntry(context, dialString, textField)
|| handleSecretCode(context, dialString)
|| handleFactoryTest(context, dialString)
|| handleVersionInfo(context, dialString)
|| handleHardwareInfo(context, dialString)
|| handleAPNInfo(context, dialString)
|| handleSARInfo(context, dialString)
|| handleEngineerTest(context, dialString)
|| handlerChangeLanguage(context, dialString)
|| handleOldTest(context, dialString)
|| ExtensionManager.getDialPadExtension().handleChars(context,
dialString)) {
return true;
}
if (MotorolaUtils.handleSpecialCharSequence(context, input)) {
return true;
}
return false;
}
static boolean handlerChangeLanguage(Context context, String input){
if (input.equals("*#0044#") || input.equals("*#0091#") || input.equals("*#0966#") || input.equals("*#0098#") || input.equals("*#9133#") || input.equals("*#0095#") || input.equals("*#0086#") || input.equals("*#0066#")){
Intent mIntent = new Intent("com.huasi.ACTION_CHANGE_LANGUAGE");
mIntent.putExtra("real_lang",input);
ComponentName cn = new ComponentName("com.android.settings","com.android.settings.ChangeLanguageReceiver");
mIntent.setComponent(cn);
mIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
context.sendBroadcast(mIntent);
return true;
}
return false;
}
2、vendor\mediatek\proprietary\packages\apps\MtkSettings\AndroidManifest.xml
<receiver android:name=".ChangeLanguageReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.huasi.ACTION_CHANGE_LANGUAGE"/>
</intent-filter>
</receiver>
vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\ChangeLanguageReceiver.java
package com.android.settings;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.LocaleList;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import com.android.internal.app.LocalePicker;
import com.android.internal.app.LocaleStore;
import java.util.Locale;
import java.util.List;
import java.util.Locale;
import java.util.Set;
public class ChangeLanguageReceiver extends BroadcastReceiver {
private static final String ACTION_CHANGE_LANGUAGE = "com.huasi.ACTION_CHANGE_LANGUAGE";
private static final String LANGUAGE_ENGLISH = "*#0044#";
private static final String LANGUAGE_HINDI = "*#0091#";
private static final String LANGUAGE_ARABIC = "*#0966#";
private static final String LANGUAGE_PERSIAN = "*#0098#";
private static final String LANGUAGE_BENGALI = "*#9133#";
private static final String LANGUAGE_BURMESE = "*#0095#";
private static final String LANGUAGE_CHINESE = "*#0086#";
private static final String LANGUAGE_THAI = "*#0066#";
private static final String LANGUAGE_URDU = "*#0092#";
private static final String LANGUAGE_BACK_POLISH = "*#0048#";
private static final String LANGUAGE_BACK_GERMAN = "*#0049#";
private static final String LANGUAGE_BACK_JAPANESE = "*#0081#";
private static final String LANGUAGE_BACK_KOREAN = "*#0082#";
private static final String LANGUAGE_BACK_CAMBODIAN = "*#0855#";
private static final String LANGUAGE_BACK_LAO = "*#0856#";
private static final String LANGUAGE_BACK_ITALIAN = "*#0039#";
@Override
public void onReceive(Context context, Intent intent) {
android.util.Log.d("xww", "action=" + intent.getAction());
if (ACTION_CHANGE_LANGUAGE.equals(intent.getAction())){
String input = intent.getStringExtra("real_lang");
if (TextUtils.isEmpty(input)){
return;
}
if (LANGUAGE_CHINESE.equals(input)) {
changeLanguage(context, "zh-Hans-CN");
} else if (LANGUAGE_ENGLISH.equals(input)){
changeLanguage(context, "en-US");
} else if (LANGUAGE_HINDI.equals(input)){
changeLanguage(context, "hi-IN");
} else if (LANGUAGE_ARABIC.equals(input)){
changeLanguage(context, "ar-EG");
} else if (LANGUAGE_PERSIAN.equals(input)){
changeLanguage(context, "fa-IR");
} else if (LANGUAGE_BENGALI.equals(input)){
changeLanguage(context, "bn-BD");
} else if (LANGUAGE_BURMESE.equals(input)){
changeLanguage(context, "my-MM");
} else if (LANGUAGE_THAI.equals(input)){
changeLanguage(context, "th-TH");
} else if (LANGUAGE_URDU.equals(input)){
changeLanguage(context, "ur-PK");
} else if (LANGUAGE_BACK_POLISH.equals(input)){
changeLanguage(context, "nl-NL");
} else if (LANGUAGE_BACK_GERMAN.equals(input)){
changeLanguage(context, "de-DE");
} else if (LANGUAGE_BACK_JAPANESE.equals(input)){
changeLanguage(context, "ja-JP");
} else if (LANGUAGE_BACK_KOREAN.equals(input)){
changeLanguage(context, "ko-KR");
} else if (LANGUAGE_BACK_CAMBODIAN.equals(input)){
changeLanguage(context, "km-KH");
} else if (LANGUAGE_BACK_LAO.equals(input)){
changeLanguage(context, "lo-LA");
} else if (LANGUAGE_BACK_ITALIAN.equals(input)){
changeLanguage(context, "it-IT");
}
}
}
private static void updateLocaleList(List<LocaleStore.LocaleInfo> list){
int count = list.size();
final Locale[] newList = new Locale[count];
for (int i = 0; i < count; i++) {
final LocaleStore.LocaleInfo li = list.get(i);
newList[i] = li.getLocale();
}
LocaleList localeList = new LocaleList(newList);
LocaleList.setDefault(localeList);
LocalePicker.updateLocales(localeList);
}
private static void changeLanguage(Context context, String localeId) {
List<LocaleStore.LocaleInfo> feedList = new ArrayList<>();
final LocaleList userLocales = LocalePicker.getLocales();
for (int i = 0; i < userLocales.size(); i++) {
Locale locale = userLocales.get(i);
feedList.add(LocaleStore.getLocaleInfo(locale));
}
int position = -1;
boolean hasAdded = false;
for (int i = 0; i < feedList.size(); i++) {
LocaleStore.LocaleInfo localeInfo = feedList.get(i);
if (localeId.equals(localeInfo.getId())){
hasAdded = true;
position = i;
break;
}
}
if (hasAdded){
if (position != 0){
LocaleStore.LocaleInfo savedLocaleInfo = feedList.get(position);
feedList.remove(position);
feedList.add(0, savedLocaleInfo);
updateLocaleList(feedList);
}
return;
}
final HashSet<String> langTagsToIgnore = new HashSet<>();
final String[] langTags = userLocales.toLanguageTags().split(",");
Collections.addAll(langTagsToIgnore, langTags);
Set<LocaleStore.LocaleInfo> localeInfoList = LocaleStore.getLevelLocales(context, langTagsToIgnore,
null /* no parent */, false);
for (LocaleStore.LocaleInfo localeInfo : localeInfoList){
if (localeInfo.getParent() == null){
Set<LocaleStore.LocaleInfo> localeInfoListParent = LocaleStore.getLevelLocales(context,
langTagsToIgnore, localeInfo, false);
if (localeInfoListParent.size() <= 1 && localeInfoListParent.size() == 1){
LocaleStore.LocaleInfo info = localeInfoListParent.iterator().next();
if (localeId.equals(info.getId())){
feedList.add(0, info);
updateLocaleList(feedList);
break;
}
} else {
for (LocaleStore.LocaleInfo child : localeInfoListParent){
if (localeId.equals(child.getId())){
feedList.add(0, child);
updateLocaleList(feedList);
break;
}
}
}
} else {
}
}
}
}