Java 从单独的类调用文本到语音到活动类
我正在尝试创建一个类,可以从任何活动调用该类来从EditText框中说出文本。当我运行当前拥有的代码时,它会播放警报声音,但随后无法播放文本到语音内容。我需要改变什么才能让文本也播放?我知道activity layout XML代码是正确的,因为文本到语音代码在直接位于activity类中时有效。我四处寻找了一个解决方案,但没有其他地方概述了如何从线程上下文中实现这一点 我已将我的代码包括在下面: 在AircraftMain.java上Java 从单独的类调用文本到语音到活动类,java,android,text-to-speech,google-text-to-speech,Java,Android,Text To Speech,Google Text To Speech,我正在尝试创建一个类,可以从任何活动调用该类来从EditText框中说出文本。当我运行当前拥有的代码时,它会播放警报声音,但随后无法播放文本到语音内容。我需要改变什么才能让文本也播放?我知道activity layout XML代码是正确的,因为文本到语音代码在直接位于activity类中时有效。我四处寻找了一个解决方案,但没有其他地方概述了如何从线程上下文中实现这一点 我已将我的代码包括在下面: 在AircraftMain.java上 View.OnClickListener speakBtn
View.OnClickListener speakBtnOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View arg0) {
String toSpeak = textToSpeak.getText().toString();
TextToSpeak speak = new TextToSpeak(AircraftMain.this, toSpeak);
speak.run();
}
};
import android.app.Activity;
import android.media.MediaPlayer;
import android.speech.tts.TextToSpeech;
import java.util.Locale;
public class TextToSpeak implements Runnable {
private Activity activity;
private static String text;
private static TextToSpeech talk;
public TextToSpeak(Activity activity, String toSpeak) {
this.activity = activity;
text = toSpeak;
}
public void run() {
talk = new TextToSpeech(activity, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR) {
talk.setLanguage(Locale.UK);
}
}
});
talk.addEarcon("Attention", "com.kieronmc.aircraftgps", R.raw.warning_beep);
talk.playEarcon("Attention", QUEUE_ADD,null);
talk.setLanguage(Locale.UK);
talk.speak(text, TextToSpeech.QUEUE_ADD, null);
}
}
TextToSpeak.java
View.OnClickListener speakBtnOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View arg0) {
String toSpeak = textToSpeak.getText().toString();
TextToSpeak speak = new TextToSpeak(AircraftMain.this, toSpeak);
speak.run();
}
};
import android.app.Activity;
import android.media.MediaPlayer;
import android.speech.tts.TextToSpeech;
import java.util.Locale;
public class TextToSpeak implements Runnable {
private Activity activity;
private static String text;
private static TextToSpeech talk;
public TextToSpeak(Activity activity, String toSpeak) {
this.activity = activity;
text = toSpeak;
}
public void run() {
talk = new TextToSpeech(activity, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR) {
talk.setLanguage(Locale.UK);
}
}
});
talk.addEarcon("Attention", "com.kieronmc.aircraftgps", R.raw.warning_beep);
talk.playEarcon("Attention", QUEUE_ADD,null);
talk.setLanguage(Locale.UK);
talk.speak(text, TextToSpeech.QUEUE_ADD, null);
}
}
请尝试此代码,它应该可以工作: 1) 创建一个文本到语音初始值设定项,如下所示:
public class TextToSpeechInitializer{
private Context context;
private static TextToSpeech talk;
private TextToSpeechIniListener callback;
private Locale locale;
public TextToSpeechInitializer(Context context , Locale locale , TextToSpeechIniListener l) {
this.context = context;
if(l != null) {
callback = l;
}
this.locale = locale;
initialize();
}
private void initialize() {
talk = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
talk.setLanguage(locale); //TODO: Check if locale is available before setting.
callback.onSucces(talk);
}else{
callback.onFailure(talk);
Log.e("TTS","TextToSpeechInitializeError");
}
}
});
}
}
2) 上述初始值设定项类调用此接口类以通知以下活动(TTS成功或失败):
3) 活动
布局demo7.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/b"
android:text="speak"/>
</LinearLayout>
我不是在最后一行代码中实现它吗<代码>talk.speak(text,TextToSpeech.QUEUE\u ADD,null)代码>我认为您创建的mediaPlayer正在阻止speak方法执行应该执行的操作。您可以使用此处提供的AddEarcon和PlayEarcon方法,而不是使用mediaPlayer启动警报声音。您确定在尝试talk之前已调用onInit()。说话?我已将代码更改为使用AddEarcon和PlayEarcon,现在没有声音播放。似乎有声音出来的问题。可能没有调用onInit()方法。如何更改代码以确保调用onInit()?我遇到的错误是没有绑定到TTS引擎。e、 g.W/TextToSpeech:playEarcon失败:未绑定到TTS引擎;W/TextToSpeech:setLanguage失败:未绑定到TTS引擎;W/TextToSpeech:speak失败:未绑定到TTS引擎代码>不要忘记将R.raw.androidcalm更改为原始资源文件。不应使用活动上下文。这将造成潜在的泄漏