Инициализация TextToSpeech на Android - что, если он не работает? - PullRequest
0 голосов
/ 11 мая 2018

В Android, если экземпляр TextToSpeech не удается инициализировать (вызванный обратный вызов, указывающий на завершение инициализации движка TextToSpeech, возвращает TextToSpeech.ERROR), означает ли это, что последующие попытки вызова метода для этого экземпляра приведут к исключениям нулевого указателя?

Пример ...

Мы инициализируем объект:

t1 = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.ERROR) {
                    Log.i("XXX", "There was an error initializing the TTS");
                }
            }
        });

... скажем, инициализация не удалась, но затем мы продолжаем делать что-то вроде:

t1.speak("hello");

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

Кроме того, причина, по которой я не могу просто выяснить для себя, состоит в том, что я не знаю, каксмоделируйте ошибку.

Спасибо за любые предварительные знания.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

По основному вопросу прочитайте документы по методу speak() ( здесь ):

Этот метод асинхронный, то есть метод просто добавляет запрос к очередь запросов TTS, а затем возвращается.

Таким образом, если ваш экземпляр tts не равен null, он не должен выдавать никаких исключений или вызывать сбой приложения, а просто возвращать код ошибки.

Кроме того, причина, по которой я не могу просто выяснить для себя, состоит в том, что я не знаю, как симулировать ошибку.

Попробуйте использовать конструктор ( см. Документы ), который ожидает в качестве третьего параметра String engine, и поместите туда недопустимое имя пакета. Вероятно, это должно привести к ошибке. (или отключить / удалить все движки TTS на вашем устройстве / эмуляторе)

Важное замечание относительно конструктора:

В случае сбоя слушатель может быть вызван немедленно, до того, как экземпляр TextToSpeech будет полностью создан.

Поэтому, если статус не SUCCESS, вы не должны касаться вашего tts в слушателе (конечно, вы можете использовать tts впоследствии, как в вашем примере), потому что он может не даже быть назначенным / инициализированным.

0 голосов
/ 11 мая 2018

Вы можете попробовать с этим кодом.

Использовать language_codes из https://www.w3schools.com/tags/ref_language_codes.asp.

mLanguage = new Locale(language_codes);

tts = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR) {
                int result = tts.setLanguage(mLanguage);
                if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("Text2SpeechWidget", result + " is not supported");
                }
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...