在定制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 ]; do
sleep 1
counter=$((counter + 1))
done
sleep 2
#检测/sdcard/flags.tts 执行完成标志是否存在,若存在则表示已经执行过,直接退出
if [ -f /sdcard/flags.tts ]; then
exit 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");
}
});