Вы можете попробовать использовать JobIntentService (Post Android-O) или IntentService для вызова TTS из приемника вещания. У него меньше издержек, чем при запуске действия, чтобы дать TTS правильный контекст. Обратите внимание, что вы не можете передать контекст получателя широковещательной передачи TTS.
Вот мой фрагмент кода, в котором я получил то же самое, используя JobIntentService.
Внутри вашего пользовательского приемника Broadcast onReceive () вызывает ваш пользовательский JobIntentService, например:
Intent speechIntent = new Intent();
speechIntent.putExtra("MESSAGE", "Bluetooth is on.");
MySpeakService.enqueueWork(context, speechIntent);
И MySpeakService.java это:
import android.content.Context;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
public class MySpeakService extends JobIntentService {
private TextToSpeech mySpeakTextToSpeech = null;
private boolean isSafeToDestroy = false;
public static void enqueueWork(Context context, Intent intent) {
enqueueWork(context, MySpeakMessageService.class, 1, intent);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
String message = intent.getStringExtra("MESSAGE");
mySpeakTextToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
mySpeakTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, null, null);
while (mySpeakTextToSpeech.isSpeaking()) {
}
isSafeToDestroy = true;
}
});
}
@Override
public void onDestroy() {
if (isSafeToDestroy) {
if (mySpeakTextToSpeech != null) {
mySpeakTextToSpeech.shutdown();
}
super.onDestroy();
}
}
}