Android系統之路(初識MTK) ------ Default Voice Control/輸入法校準、自動校準、首字母大寫、按鍵聲音

今天給大家分享MTK平臺系統編程與修改的另一個部分,分別是輸入法校準、自動校準默認關、首字母大寫默認開、按鍵聲音默認關、Voice Control 移除系統中文,默認

英文,下面一個一個的介紹給大家


①Language & input> Android Keyboard>Auto Correction > Uncheck as Default(Off) 語言輸入-安卓鍵盤-自動校準默認關

根據紅色框關鍵詞用命令行在settings下執行熱詞檢索:



.../mnt/disk3/jsp/xxx8382$ find packages/apps/Settings/ -name "*.xml" | xargs grep "Very aggressive" -l

搜索無果,於是擴大搜索範圍,鍵入如下命令行

.../mnt/disk3/jsp/xxx8382$ find packages/ -name "*.xml" | xargs grep "Very aggressive" -l
packages/inputmethods/LatinIME/java/res/values/strings.xml
packages/inputmethods/LatinIME/java/res/values-en-rIN/strings.xml
packages/inputmethods/LatinIME/java/res/values-en-rGB/strings.xml

得到3條結果,進入查看得到熱詞 auto_correction_threshold_mode_very_aggressive 搜索熱詞


android5@ubuntu2015:/mnt/disk3/jsp/xxx8382$ find packages/ -name "*.xml" | xargs grep "auto_correction_threshold_mode_very_aggressive" -l
packages/inputmethods/LatinIME/java/res/values-es/strings.xml
packages/inputmethods/LatinIME/java/res/values-ms-rMY/strings.xml
packages/inputmethods/LatinIME/java/res/values-my/strings.xml
packages/inputmethods/LatinIME/java/res/values-ky-rKG/strings.xml
packages/inputmethods/LatinIME/java/res/values-hu/strings.xml
packages/inputmethods/LatinIME/java/res/values-ne-rNP/strings.xml
packages/inputmethods/LatinIME/java/res/values-pl/strings.xml
packages/inputmethods/LatinIME/java/res/values-lo-rLA/strings.xml
packages/inputmethods/LatinIME/java/res/values/strings.xml
packages/inputmethods/LatinIME/java/res/values/config-auto-correction-thresholds.xml

查看 config-auto-correction-thresholds.xml 文件 ,查找如下代碼

    <!-- The index of the auto correction threshold values array. -->
    <string name="auto_correction_threshold_mode_index_off" translatable="false">0</string>
    <string name="auto_correction_threshold_mode_index_modest" translatable="false">1</string>
    <string name="auto_correction_threshold_mode_index_aggressive" translatable="false">2</string>
    <string name="auto_correction_threshold_mode_index_very_aggressive" translatable="false">3</string>

    <!-- The array of the auto correction threshold settings values. -->
    <string-array name="auto_correction_threshold_mode_indexes" translatable="false">
      <item>@string/auto_correction_threshold_mode_index_off</item>
      <item>@string/auto_correction_threshold_mode_index_modest</item>
      <item>@string/auto_correction_threshold_mode_index_aggressive</item>
      <item>@string/auto_correction_threshold_mode_index_very_aggressive</item>
    </string-array>
    <!-- The array of the human readable auto correction threshold settings entries. -->
    <string-array name="auto_correction_threshold_modes" translatable="false">
      <item>@string/auto_correction_threshold_mode_off</item>
      <item>@string/auto_correction_threshold_mode_modest</item>
      <item>@string/auto_correction_threshold_mode_aggressive</item>
      <item>@string/auto_correction_threshold_mode_very_aggressive</item>
    </string-array>


繼續熱詞搜索追蹤


jsp@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find packages/ -name "*.xml" | xargs grep "auto_correction_threshold_modes" -l
packages/inputmethods/LatinIME/java/res/values/config-auto-correction-thresholds.xml
packages/inputmethods/LatinIME/java/res/xml/prefs_screen_correction.xml

查看 prefs_screen_correction.xml 文件 修改如下,運用 Beyond Compare 工具直接copy

    <ListPreference
        android:key="auto_correction_threshold"
        android:title="@string/auto_correction"
        android:summary="@string/auto_correction_summary"
        android:entryValues="@array/auto_correction_threshold_mode_indexes"
        android:entries="@array/auto_correction_threshold_modes"
        android:defaultValue="@string/auto_correction_threshold_mode_index_off"
        android:persistent="true" />
就可以重新修改默認值,重新編譯工程,刷機即可看到效果

重新刷機第一次開機之後的效果圖:



②系統輸入法自動大寫默認開/輸入法按鍵音效默認關/輸入法拼寫校準默認開-修改

熱詞檢索命令

android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find packages/ -name "*.xml" | xargs grep "按鍵音效" -l 
packages/inputmethods/LatinIME/java/res/values-zh-rCN/strings.xml
android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find packages/ -name "*.xml" | xargs grep "sound_on_keypress" -l
packages/inputmethods/LatinIME/java/res/values-es/strings.xml
packages/inputmethods/LatinIME/java/res/values-ms-rMY/strings.xml
packages/inputmethods/LatinIME/java/res/values-my/strings.xml
packages/inputmethods/LatinIME/java/res/values-ky-rKG/strings.xml
packages/inputmethods/LatinIME/java/res/values-hu/strings.xml
packages/inputmethods/LatinIME/java/res/values-ne-rNP/strings.xml
packages/inputmethods/LatinIME/java/res/values-pl/strings.xml
packages/inputmethods/LatinIME/java/res/values-lo-rLA/strings.xml
packages/inputmethods/LatinIME/java/res/values/strings.xml
packages/inputmethods/LatinIME/java/res/values-es-rUS/strings.xml
packages/inputmethods/LatinIME/java/res/values-bn/strings.xml
packages/inputmethods/LatinIME/java/res/values-tl/strings.xml
packages/inputmethods/LatinIME/java/res/xml/prefs_screen_preferences.xml


查看 prefs_screen_preferences.xml 文件,檢索熱詞


jsp@ubuntu2015:/mnt/disk3/jsp/xxx8382$ find packages/ -name "*.xml" | xargs grep "config_default_sound_enabled" -l
packages/inputmethods/LatinIME/java/res/values/config-per-form-factor.xml

其實在prefs_screen_preferences.xml 可以直接修改,根據需求修改如下:

#首字母大寫開
    <CheckBoxPreference 
        android:key="auto_cap"
        android:title="@string/auto_cap"
        android:summary="@string/auto_cap_summary"
        android:defaultValue="true"
        android:persistent="true" />
#輸入法按鍵音效關		
	<CheckBoxPreference
        android:key="sound_on"
        android:title="@string/sound_on_keypress"
        android:defaultValue="false"
        android:persistent="true" />	
#輸入法拼寫校準默認開
    <CheckBoxPreference
        android:key="vibrate_on"
        android:title="@string/vibrate_on_keypress"
        android:defaultValue="@bool/config_default_vibration_enabled"
        android:persistent="true" />


刷機第一次啓動的效果:



③setting - voice control - language for voice control  -Keep only english 設置-聲音控制-語言只留英語去掉中文

最初效果圖,默認簡體中文:

定位到settings下檢索關鍵字

jsp@ubuntu2015:/mnt/disk3/jsp/xxx8382$ find packages/apps/Settings/ -type f|xargs grep "繁體中文" -l

搜索無果,擴大檢索範圍

jsp@ubuntu2015:/mnt/disk3/jsp/xxx8382$ find ./ -type f|xargs grep "繁體中文" -l

發現結果根本不是想要的,而且由於源碼較大,所以這個果斷放棄,採用另一個方案,使用Eclipse工具來檢索,這是筆者介紹給大家的一個非常實用的方法,以後絕對會用

得着不管是檢索資料還是反編譯apk等,都很實用

連接USB打開debugging,打開Eclipse → 打開 DDMS 點擊設備 如下界面操作:



檢索包名 com.mediatek.voicecommand

android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find -name "*.xml"|xargs grep "com.mediatek.voicecommand" -l
./vendor/mediatek/proprietary/packages/apps/VoiceCommand/tests/AndroidManifest.xml
./vendor/mediatek/proprietary/packages/apps/VoiceCommand/res/xml/voice_ui_available_preference.xml
./vendor/mediatek/proprietary/packages/apps/VoiceCommand/res/xml/voiceprocessinfo.xml
./vendor/mediatek/proprietary/packages/apps/VoiceCommand/AndroidManifest.xml
得到如上結果,大大縮小我們要查找的範圍,繼續之前的檢索
android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find vendor/mediatek/proprietary/packages/apps/VoiceCommand  -type f|xargs grep "繁體中文" -l
vendor/mediatek/proprietary/packages/apps/VoiceCommand/res/xml/voicelanguage.xml
得到 voicelanguage.xml 資源文件,繼續下一步檢索
android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find -name "*.java"|xargs grep "voicelanguage" -l
./out/target/common/R/com/mediatek/voicecommand/R.java
./out/target/common/obj/APPS/VoiceCommand_intermediates/src/com/mediatek/voicecommand/R.java

搜到的都不是想要的,繼續檢索,在當前目錄下,看某個java文件調用了剛剛DDMS解析的 list 資源 id

android5@ubuntu2015:/mnt/disk3/jsp/RMT8382$ find vendor/mediatek/proprietary/packages/apps/VoiceCommand -name "*.java"|xargs grep "list" -l
vendor/mediatek/proprietary/packages/apps/VoiceCommand/tests/src/com/mediatek/voicecommand/tests/VoiceCommandTest.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/ui/settings/VoiceUiSettings.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/mgr/ConfigurationManager.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/mgr/AppDataManager.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/business/VoiceContacts.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/business/VoiceWakeupMode.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/service/VoiceCommandManagerStub.java
vendor/mediatek/proprietary/packages/apps/VoiceCommand/src/com/mediatek/voicecommand/cfg/ConfigurationXML.java

打開 VoiceUiSettings.java 查看系統代碼,檢索到相關資源

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {

			
        if (KEY_VOICE_UI_LANGUAGE.equals(preference.getKey())) {// 這就是Preference 被點擊之後跳轉的選項,也就是Voice Control 選項
            Intent intent = new Intent(
                    "com.mediatek.voicecommand.VOICE_CONTROL_LANGUAGE");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            return true;

        } else if
		......
    }
根據 Activity action 檢索Acticity 名稱
jsp@ubuntu2015:/mnt/disk3/jsp/xxx8382$ find vendor/mediatek/proprietary/packages/apps/VoiceCommand -name "*.xml"|xargs grep "com.mediatek.voicecommand.VOICE_CONTROL_LANGUAGE" -l
vendor/mediatek/proprietary/packages/apps/VoiceCommand/AndroidManifest.xml

得到如下 Activity :

<activity android:name=".ui.settings.VoiceUiAvailableLanguageActivity" android:label="@string/voice_ui_language_title" android:taskAffinity="com.android.settings" android:configChanges="orientation|keyboardHidden|keyboard|navigation" android:parentActivityName=".ui.settings.VoiceUiSettings">


<intent-filter>

<action android:name="com.mediatek.voicecommand.VOICE_CONTROL_LANGUAGE"/>

<category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

</activity>

查看 VoiceUiAvailableLanguageActivity 代碼

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Xlog.d(TAG, "OnCreate VoiceUiAvailableLanguageFragment");
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.voice_ui_available_langs);
        mVoiceConfigMgr = ConfigurationManager.getInstance(this);
        if (mVoiceConfigMgr == null) {
            Xlog.e(TAG, "ConfigurationManager is null");
            return;
        }
        mAvailableLangs = mVoiceConfigMgr.getLanguageList(); // 繼續查看 ConfigurationManager getLanguageList() 代碼
//        mDefaultLanguage = mVoiceConfigMgr.getCurrentLanguage();// 這裏  mDefaultLanguage int 默認爲 0 
        ......
        }
    }

ConfigurationManager getLanguageList() 代碼

    public String[] getLanguageList() {
        int size = mLanguageList.size();
        if (size == 0) {
            return null;
        }
        String[] language = new String[size];
        // Log.i(VoiceCommandManagerService.TAG, "mLanguageList = "+ size);
        for (int i = 0; i < size; i++) {
            language[i] = mLanguageList.get(i).mName;
        }

        return language;
    }

mLanguageList 變量賦值的地方:

    /*
     * ConfigurationManager for control configuration
     *
     * @param context
     */
    private ConfigurationManager(Context context) {
        ......
        mCurrentLanguageIndex = mConfigurationXML
                .readVoiceLanguangeFromXml(mLanguageList);// 來自 ConfigurationXML 的 readVoiceLanguangeFromXml 函數
				
        ......
    }

繼續查看 ConfigurationXML 的 readVoiceLanguangeFromXml 函數

    /**
     * Read language info from res.
     *
     * @param languageList
     *            language list instance
     */
    public int readVoiceLanguangeFromXml(
......
        XmlPullParser parser = mContext.getResources().getXml(// 這裏就是加載語言選項 xml 的地方,下面貼上 xml 內容
                R.xml.voicelanguage);

        if (parser == null) {
            Log.e(TAG, "readVoiceLanguangeFromXml Got execption");
            return curIndex;
        }
......
    }

voicelanguage.xml 內容:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Engineer-Jsp add remove 1 and 2 item default 0 -->
<Languages>
    <Language TypeName="English" ID="0" Code="en-US" FileName="keyword/3.xml" />
    <DefaultLanguage ID="0" />
</Languages>

<!--
    <Language TypeName="簡體中文" ID="1" Code="zh-CN" FileName="keyword/1.xml" />
    <Language TypeName="繁體中文" ID="2" Code="zh-TW" FileName="keyword/2.xml" />
-->

這裏已經是我改過的,需求是去掉所有中文只留英文選項,修改 TypeName="English" 的 ID 和 DefaultLanguage ID 都爲 0 之後保存,繼續修改java邏輯


回到我們的 VoiceUiAvailableLanguageActivity ,只需要註釋掉幾句代碼就OK了

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Xlog.d(TAG, "OnCreate VoiceUiAvailableLanguageFragment");
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.voice_ui_available_langs);
        mVoiceConfigMgr = ConfigurationManager.getInstance(this);
        if (mVoiceConfigMgr == null) {
            Xlog.e(TAG, "ConfigurationManager is null");
            return;
        }
        mAvailableLangs = mVoiceConfigMgr.getLanguageList();
//        mDefaultLanguage = mVoiceConfigMgr.getCurrentLanguage();//註釋此句代碼,因爲 mDefaultLanguage 默認爲0,不再需要其他選項,自己默認爲0
......
    }

	    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        if (preference instanceof RadioButtonPreference) {
//            selectLanguage((RadioButtonPreference) preference); // 註釋掉此句,不過不註釋也不影響,只是多做了一些操作而已,都是多餘的
            Xlog.d(TAG, "default language changed to " + mAvailableLangs[mDefaultLanguage]);
            finish();
        }
        return true;
    }
selectLanguage 函數代碼:
   private void selectLanguage(RadioButtonPreference preference) {

        if (mLastSelectedPref != null) {
            if (mLastSelectedPref == preference) {
                return;
            }
            mLastSelectedPref.setChecked(false);
        }
        mDefaultLanguage = Integer.parseInt(preference.getKey().toString());
        Xlog.d(TAG, "set default language to " + mAvailableLangs[mDefaultLanguage]);
        mVoiceConfigMgr.setCurrentLanguage(mDefaultLanguage);
        preference.setChecked(true);
        mLastSelectedPref = preference;
    }

最後make自己的系統工程,重新燒錄可看效果

效果圖:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章