Подтвердить что ты не робот

TextToSpeech с API 21

Может ли кто-нибудь помочь мне использовать TTS с API 21. Все доступные примеры устарели с версией 21

Здесь мой код дает ошибку в последней строке:

Calendar cal = Calendar.getInstance();
                    cal.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                    String text = sdf.toString();
                    btn.setText("Ouvir as Horas");

                    TextToSpeech tts = new TextToSpeech(NightClock.this,(TextToSpeech.OnInitListener) NightClock.this);
                    tts.setLanguage(Locale.US);
                    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);

В Android-разработчиках говорится, что этот метод устарел и заменен следующим:

говорить (текст строки, int queueMode, параметры HashMap) Этот метод был устаревшим на уровне API 21. Начиная с уровня API 21, он заменяется выражением (CharSequence, int, Bundle, String).

Может кто-нибудь помочь скомпоновать мое приложение.

4b9b3361

Ответ 1

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

Вместо прямого вызова tts.speak(), поставьте следующий оператор if-else.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ttsGreater21(text);
} else {
    ttsUnder20(text);
}

Затем объявите ttsGreater21() и ttsUnder20() следующим образом.

@SuppressWarnings("deprecation")
private void ttsUnder20(String text) {
    HashMap<String, String> map = new HashMap<>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String text) {
    String utteranceId=this.hashCode() + "";
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}

Я подтвердил код выше с помощью Genymotion VM Android 5.0 и Android 4.4.4.

Ответ 2

tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);

Попробуйте это.

Ответ 3

Итак, я думаю, это трюк:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null, null);
    }
else {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null);
    }

Мне просто нужно проверить это на эмуляторе.

Кстати, @Aditya, так как вы были так полезны, я застрял в том же проекте, где он должен говорить, что TextToSpeech и включает экран, но мне не удается включить экран. Я попытался использовать wakelocks и флаги из всех примеров, которые я нашел:) Это делается через датчик приближения, который мне удалось сработать. Он говорит текст, но не показывает экран. Можете ли вы мне помочь?

Хорошая практика - это ключ к успеху. Все предлагаемые мной ответы отлично работают в моей Eclipse IDE. Решение вашей блокировки экрана ниже

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ..screen will stay on during this section.. wl.release();

Ответ 4

(1) Моя активность реализует TextToSpeech.OnInitListener

(2) Я играю свою синтезированную речь в методе onInit, но, полагаю, (не пробовал) вы могли играть в нее в любое время после вызова onInit(). Но это ключ, вам нужно дождаться инициализации механизма TextToSpeech.

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    public TextToSpeech mTTS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTTS = new TextToSpeech(this, this);
    }

    @Override
    public void onInit(int i) {
        mTTS.setLanguage(Locale.UK);
        mTTS.speak("Hello, how are you?", TextToSpeech.QUEUE_ADD, null, null);
    }    
}

Ответ 5

Попробуйте это

tts=new TextToSpeech(getBaseContext(),new TextToSpeech.OnInitListener() 
{       
       @Override        
       public void onInit(int status) 
       {
            tts.setLanguage(Locale.getDefault());
            tts.setPitch(1.3f);
            tts.setSpeechRate(1f);
       }
});

Ответ 6

В wakelock мне удалось сделать так:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP |
                                    PowerManager.ON_AFTER_RELEASE, "MyWakelock");

wl.aquire();
wl.release();