我正在尝试让TTS在后台运行。但是,我从来没有听到任何声音。我有一个广播接收器启动服务。我把我的TTS代码放在这两个代码中,但它从不说话。我知道正在调用该方法(我在其上设置了一个断点),但它仍然不起作用。
这是我的日志,但它似乎没有包含有关TTS服务的任何内容。
10-04 22:45:30.663: WARN/InputManagerService(209): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4423df40
10-04 22:45:37.363: INFO/PollingManager(449): calculateShortestInterval(): shortest interval is 540000
10-04 22:45:37.413: INFO/TLSStateManager(449): org.apache.harmony.nio.internal.SocketChannelImpl@4400ece0: Wrote out 29 bytes of data with 0 bytes remaining.
10-04 22:45:38.043: ERROR/IMAPEmailService(480): Can't create default IMAP system folder Trash. Please reconfigure the folder names.
10-04 22:45:40.123: ERROR/EONS(303): EF_PNN: No short Name
10-04 22:45:41.543: ERROR/WMSTS(171): Month is invalid: 0
10-04 22:45:42.043: WARN/AudioFlinger(172): write blocked for 212 msecs, 24 delayed writes, thread 0xb998
提前感谢大家!
答案 0 :(得分:12)
有助于查看您的TTS代码,以便人们更轻松地为您提供帮助。由于我已经在BroadcastReceiver中使用了TTS,这里是一个从我的代码中删除的示例。
public static class TTS extends Service implements TextToSpeech.OnInitListener, OnUtteranceCompletedListener {
private TextToSpeech mTts;
private String spokenText;
@Override
public void onCreate() {
mTts = new TextToSpeech(this, this);
// This is a good place to set spokenText
}
@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) {
mTts.speak(spokenText, TextToSpeech.QUEUE_FLUSH, null);
}
}
}
@Override
public void onUtteranceCompleted(String uttId) {
stopSelf();
}
@Override
public void onDestroy() {
if (mTts != null) {
mTts.stop();
mTts.shutdown();
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
在您希望它发言的BroadcastReceiver中启动TTS服务:
context.startService(new Intent(context, TTS.class));
我希望如果不是提问者,我会帮助别人(我确信他现在已经开始工作了。)
答案 1 :(得分:1)
如果要说的文字来自广播听众,你也可以试试这个。首先创建一个服务
public class MyTell extends Service implements OnInitListener{
public MyTell() {
}
public static TextToSpeech mTts;
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
mPreferences = getSharedPreferences(Mysettings.PREF_NAME, Service.MODE_PRIVATE);
pit = Float.parseFloat(mPreferences.getString("pit","0.8"));
rate = Float.parseFloat(mPreferences.getString("rate","1.1"));
mTts = new TextToSpeech(this, this);
super.onStart(intent, startId);
}
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
if (mTts.isLanguageAvailable(Locale.UK) >= 0)
Toast.makeText( MyTell.this,
"Sucessfull intialization of Text-To-Speech engine Mytell ",
Toast.LENGTH_LONG).show();
mTts.setLanguage(Locale.UK);
mTts.setPitch(pit);
mTts.setSpeechRate(rate);
} else if (status == TextToSpeech.ERROR) {
Toast.makeText(MyTell.this,
"Unable to initialize Text-To-Speech engine",
Toast.LENGTH_LONG).show();
}
}}
然后创建您插入文本的侦听器
public class MyBroadCast extends BroadcastReceiver {
public MyPop() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//here is where you're use the service you created to speak the text
MyTell.mTts.speak("Text to be spoken", TextToSpeech.QUEUE_FLUSH,null);
}
}
确保在使用tts引擎之前启动服务,并检查tts引擎是否可用
答案 2 :(得分:1)
它为我工作(只需添加清单权限)
public class TES extends Service implements TextToSpeech.OnInitListener {
private TextToSpeech tts;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
tts = new TextToSpeech(this, this);
speakOut();
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
}
speakOut();
} else {
Log.e("TTS", "Initilization Failed!");
}
}
private void speakOut() {
tts.speak("its working", TextToSpeech.QUEUE_FLUSH, null);
}
}
答案 3 :(得分:0)
Android TTS是一项有限的服务。广播接收器具有有限的上下文,并且不能将自己绑定到任何服务。但是,它可以启动服务。这里显示的所有示例都是启动TTS引擎和启动它们的接收器的服务。 您也可以通过活动来完成,但如果您不需要UI,则服务更好。 我认为理解它是如何工作以及为什么有效是个好主意。 祝你好运。
答案 4 :(得分:0)
使用Kotlin,上述答案可以重写为:
Receiver
:
class MyReceiver : BroadcastReceiver() {
val ttsService = Intent(context, TTS::class.java)
context.startService(ttsService)
}
Service
:
class TTS : Service(), TextToSpeech.OnInitListener {
private var mTts: TextToSpeech? = null
private var spokenText: String? = null
override fun onCreate() {
mTts = TextToSpeech(this, this)
// This is a good place to set spokenText
spokenText = "Hello!.."
}
override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
val result = mTts!!.setLanguage(Locale.US)
if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) {
Thread().run {
mTts!!.apply {
speak(spokenText, TextToSpeech.QUEUE_FLUSH, null, null)
}
Thread.sleep(10000)
stopSelf()
}
}
} else if (status == TextToSpeech.ERROR) {
stopSelf()
}
}
override fun onDestroy() {
if (mTts != null) {
mTts!!.stop()
mTts!!.shutdown()
}
super.onDestroy()
}
override fun onBind(arg0: Intent): IBinder? {
return null
}
}
在Manifest
:
<receiver
android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.xxxx" />
</intent-filter>
</receiver>
<service android:name=".TTS" />
答案 5 :(得分:0)
从Android-O开始使用具有此类服务的服务background restrictions。可以使用JobIntentService实现与here相同的功能。