我在我的应用程序中使用文本到语音引擎。它在带有API 23及更高版本的仿真器Nexus 6上运行良好。但是在带有API 22的仿真器Nexus 6上,它并没有说话。两个仿真器都使用Pico TTS作为首选引擎。
我的活动布局只包含一个按钮“Speak”。这是我的活动代码:
public class MainActivity extends AppCompatActivity {
private TextToSpeech mTTS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button speakBtn = findViewById(R.id.button);
speakBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
speak();
}
});
mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = mTTS.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "Language not supported");
}
mTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Log.d("TTS", "onStart called, utteranceId = " + utteranceId);
}
@Override
public void onDone(String utteranceId) {
Log.d("TTS", "onDone called, utteranceId = " + utteranceId);
}
@Override
public void onError(String utteranceId) {
Log.d("TTS", "onError called, utteranceId = " + utteranceId);
}
});
} else {
Log.e("TTS", "Initialization failed");
}
}
});
}
private void speak() {
Log.d("TTS", "speak() method called");
HashMap<String, String> map = new HashMap<>();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "greeting");
mTTS.speak("hello", TextToSpeech.QUEUE_FLUSH, map);
}
}
这是来自仿真器Nexus 6 API 22的所有日志:
02-18 13:54:09.942 9739-9739 /? E / libprocessgroup:无法生成和chown / acct / uid_10059:只读文件系统
02-18 13:54:09.943 9739-9739 /? W / Zygote:createProcessGroup失败,内核缺少CONFIG_CGROUP_CPUACCT?
02-18 13:54:09.943 9739-9739 /?我/艺术:不迟到-Xcheck:jni(已经开启)
02-18 13:54:09.961 9739-9748 /? E / art:向调试器发送回复失败:管道损坏
02-18 13:54:09.961 9739-9748 /?我/艺术:调试器不再有效
02-18 13:54:09.992 9739-9739 /? W / art:在Android 4.1之前,方法android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter,android.content.res.ColorStateList,android.graphics.PorterDuff $ Mode)会有错误地覆盖了android.graphics.drawable.Drawable中的package-private方法
02-18 13:54:10.001 9739-9739 /?我/艺术:拒绝在先前失败的类java.lang.Class上重新初始化
02-18 13:54:10.001 9739-9739 /?我/艺术:拒绝在先前失败的类java.lang.Class上重新初始化
02-18 13:54:10.064 9739-9739 /? I / TextToSpeech:成功绑定到com.svox.pico
02-18 13:54:10.072 9739-9757 /? D / OpenGLRenderer:使用EGL_SWAP_BEHAVIOR_PRESERVED:true
02-18 13:54:10.074 9739-9739 /? D / Atlas:验证地图......
02-18 13:54:10,093 9739-9739 /? I / TextToSpeech:连接到ComponentInfo {com.svox.pico / com.svox.pico.PicoService}
02-18 13:54:10.096 9739-9758 /? I / TextToSpeech:设置与ComponentInfo的连接{com.svox.pico / com.svox.pico.PicoService}
02-18 13:54:10.111 9739-9757 /? I / OpenGLRenderer:初始化的EGL,版本1.4
02-18 13:54:10.111 9739-9757 /? W / OpenGLRenderer:无法用EGL_SWAP_BEHAVIOR_PRESERVED选择配置,重试没有...
02-18 13:54:10,128 9739-9757 /? D / EGL_emulation:eglCreateContext:0xae434e20:5月2分0 rcv 2
02-18 13:54:10.131 9739-9757 /? D / EGL_emulation:eglMakeCurrent:0xae434e20:ver 2 0
02-18 13:54:10.134 9739-9757 /? D / OpenGLRenderer:启用调试模式0
02-18 13:54:10.174 9739-9757 /? D / EGL_emulation:eglMakeCurrent:0xae434e20:ver 2 0
02-19 09:32:25.570 9739-9739 / com.example.ttsapp D / TTS:调用speak()方法
弄清楚如何解决问题。如果在启动Android Studio后不是通过调试或执行而是从AVD Manager启动模拟器,一切正常。