Quelqu'un peut-il m'aider à utiliser TTS avec l'API 21. Tous les exemples disponibles sont obsolètes avec la version 21
Voici mon code donnant une erreur sur la dernière ligne:
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);
Dans les développeurs Android, il est dit que cette méthode est déconseillée et remplacée par ceci:
speak (String text, int queueMode, HashMap params) Cette méthode est déconseillée au niveau 21 de l'API. A partir du niveau 21 de l'API, elle est remplacée par speak (CharSequence, int, Bundle, String).
Quelqu'un peut-il m'aider à coder mon application?.
J'ai recherché divers sites. Enfin, je pense que je pourrais obtenir la réponse à votre question ...
Au lieu d'appeler directement tts.speak (), placez l'instruction if-else suivante.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
ttsGreater21(text);
} else {
ttsUnder20(text);
}
Déclarez ensuite ttsGreater21 () et ttsUnder20 () comme suit.
@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);
}
J'ai confirmé le code ci-dessus avec Genymotion VM Android 5.0 et Android 4.4.4.
Donc je suppose que c'est l'astuce:
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);
}
J'ai juste besoin de tester cela sur émulateur.
Soit dit en passant, @Aditya depuis que vous avez été si utile, je suis coincé dans le même projet où il devrait parler de TextToSpeech et allume l'écran mais je n'ai pas réussi à allumer l'écran. J'ai essayé d'utiliser des wakelocks et des drapeaux de tous les exemples que j'ai trouvés :) Cela se fait via le capteur de proximité que j'ai réussi à travailler. Il dit le texte mais n'affiche pas l'écran. Pouvez-vous m'aider à ce sujet?
Une bonne pratique est la clé du succès. Toutes les réponses suggérées par moi fonctionnent parfaitement dans mon IDE Eclipse. La solution de votre verrouillage d'écran est ci-dessous
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();
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);
Essaye ça.
(1) Mon activité implémente TextToSpeech.OnInitListener
(2) Je joue mon discours synthétisé dans la méthode onInit, mais je suppose (pas essayé) que vous pouvez le jouer à tout moment après l'appel de onInit (). Mais c'est la clé, vous devez attendre que le moteur TextToSpeech s'initialise.
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);
}
}
Essaye ça
tts=new TextToSpeech(getBaseContext(),new TextToSpeech.OnInitListener()
{
@Override
public void onInit(int status)
{
tts.setLanguage(Locale.getDefault());
tts.setPitch(1.3f);
tts.setSpeechRate(1f);
}
});
Le wakelock, j'ai réussi à faire fonctionner le ti de cette façon:
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();