Android называют TTS в BroadcastReceiver - PullRequest
7 голосов
/ 21 декабря 2010

Мне нужно вызвать службу TTS в подклассе BroadcastReceiver. Когда я реализую этот класс из OnInitListener, он дал ошибку во время выполнения.

Есть ли другой способ реализовать TTS в BroadcastReceiver?

Спасибо,

Извините, код:

public class TextApp extends BroadcastReceiver implements OnInitListener {
private TextToSpeech tts;
private String message = "Hello";


@Override
public void onReceive(Context context, Intent intent) {
    tts = new TextToSpeech(context, this);
    message = "Hello TTS";
}

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS)
    {
        tts.speak(message, TextToSpeech.QUEUE_FLUSH, null);
    }


}
}

Ответы [ 3 ]

6 голосов
/ 17 декабря 2013

Ваш код не работал:

tts = new TextToSpeech(context, this);

Контекст в BroadcastReceiver - это " ограниченный контекст ".Это означает, что вы не можете запустить службу в контексте BroadcastReceiver.Поскольку TTS является службой, поэтому она не вызывает ничего.

Наилучшие решения - это начать другое намерение на BroadcastReceiver с действия, которое вызывает службу.активность, которую вы вызываете сервисом TTS с параметром из дополнений

public class ReadTheMessage extends Activity implements OnInitListener,OnUtteranceCompletedListener {

private TextToSpeech tts = null;
private String msg = "";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent startingIntent = this.getIntent();
    msg = startingIntent.getStringExtra("MESSAGE");
    tts = new TextToSpeech(this,this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (tts!=null) {
        tts.shutdown();
    }
}

// OnInitListener impl
public void onInit(int status) {
    tts.speak(msg, TextToSpeech.QUEUE_FLUSH, null);
}

// OnUtteranceCompletedListener impl
public void onUtteranceCompleted(String utteranceId) {
    tts.shutdown();
    tts = null;
    finish();
}
}
1 голос
/ 30 марта 2019

Вы можете попробовать использовать 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();
            }
        }
    }
1 голос
/ 30 декабря 2015

Al Zil ответ не совсем правильный.Android TTS - это ограниченный сервис.Приемники вещания действительно имеют ограниченный контекст, но они не могут связывать себя с какой-либо услугой.Тем не менее, они могут начать обслуживание.Запуск tts с активности - это нормально, но если вам не нужен пользовательский интерфейс, вы также можете инициализировать его из службы.Посмотрите на этот ответ , чтобы увидеть, как это делается

Удачи.

...