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).
Может кто-нибудь помочь скомпоновать мое приложение.
Ответы
Ответ 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();