web-dev-qa-db-fra.com

TextToSpeech avec API 21

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?.

18
Jose Borges

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.

41
xanadu6291

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();

5
Jose Borges
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);

Essaye ça.

5
Aditya

(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);
    }    
}
2
unshul

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);
       }
});
0
Aditya

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();
0
Jose Borges