在定制Android系統時,預裝Google TTS引擎并實現開箱即用的語音服務能顯著提升用戶體驗。本文將詳解預裝APK→設為默認引擎→語音包預緩存的實現方案,適用于ROM開發者或系統定制場景。
分步實現方案
預裝Google TTS APK
預裝APK這里可以采用很多種方式,這里不去細說。
強制設為默認引擎
關鍵修改位置:
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
代碼注入:
// 在loadSecureSettings()方法中添加:
@Override
void loadSecureSettings(SQLiteDatabase db) {// ...原有代碼loadStringSetting(stmt, Settings.Secure.TTS_DEFAULT_SYNTH, R.string.default_tts_engine); // 關鍵注入點
}
資源配置:
在res/values/config.xml定義引擎包名:
<string name="default_tts_engine" translatable="false">com.google.android.tts</string>
語音包預緩存實現
操作流程:
手動完成首次語音包下載(進入設置→語言與輸入→文字轉語音)
提取緩存數據:
adb pull /data/user_de/0/com.google.android.tts/files
集成到系統鏡像:
這里使用腳本的方式,我們這里使用開始腳本的方式,將文件解壓到APK的混存目錄,并實現一定的邏輯,首先使用腳本將文件copy到系統的一個目錄下 可以使用PRODUCT_COPY_FILES
方式進行copy,作者這里有一個分區是專門給定制ROM使用的所以作者放到了這里面,下面是實現的腳本,腳本很容易理解這里就不做多解釋。
#!/system/bin/sh#等待桌面啟動完成
desk="com.android.launcher3"
counter=0
max_retries=60
while [ -z "$(dumpsys activity top | grep $desk)" ] && [ $counter -lt $max_retries ]; dosleep 1counter=$((counter + 1))
donesleep 2#檢測/sdcard/flags.tts 執行完成標志是否存在,若存在則表示已經執行過,直接退出
if [ -f /sdcard/flags.tts ]; thenexit 0
fi#將tts包復制到/data/user_de/0/com.google.android.tts/files目錄下
mkdir /data/user_de/0/com.google.android.tts/files
cp -r /oem/tts/superpacks /data/user_de/0/com.google.android.tts/files
chmod -R 777 /data/user_de/0/com.google.android.tts/files
touch /sdcard/flags.tts
測試是否成功
編寫APK測試是否能正常播放文本
TextToSpeech tts = new TextToSpeech(context, status -> {if(status == TextToSpeech.SUCCESS) {assertThat(tts.getDefaultEngine()).isEqualTo("com.google.android.tts");}
});