Les applications avec des interfaces qui utilisent la voix ont un attrait unique. Ils ont tendance à donner l'impression à leurs utilisateurs d'utiliser quelque chose de futuriste. Depuis ses débuts, Android dispose d'une fonctionnalité de synthèse vocale (TTS) très robuste. Cette année, Google a ajouté de nombreuses voix de haute qualité à son moteur TTS, ce qui est une raison de plus pour les développeurs de l'utiliser dans leurs applications..
Dans ce tutoriel, vous allez apprendre à créer une application simple avec une interface utilisateur minimaliste, capable de recevoir des messages texte et de les lire à l'utilisateur..
Assurez-vous que l’ensemble Eclipse ADT est configuré. Vous pouvez le télécharger sur le site Web Android Developer. Pour de meilleurs résultats, vous aurez également besoin d’un véritable appareil Android et de quelques amis pouvant vous envoyer des messages texte..
Lancez Eclipse et créez une nouvelle application Android. Appelez cette application SMSReader. Si vous pensez publier cette application sur Google Play pour la partager avec vos amis, veillez à utiliser un nom de package unique. Met le SDK minimum requis à Android 2.2 et mettre le SDK cible à Android 4.4.
Cette application aura un Activité
. Sélectionner Créer une activité et choisir Activité vide.
Nomme le Activité principale et cliquez terminer.
Cette application nécessite trois autorisations:
Ajoutez les lignes suivantes à votre AndroidManifest.xml.
Cette application va avoir une seule orientation de l'écran, portrait. Par conséquent, éditez le activité
tag et ajoutez-y l'attribut suivant:
android: screenOrientation = "portrait"
Le manifeste est maintenant complet.
Il n'est pas absolument nécessaire, mais stocker toutes les chaînes que l'application utilise dans le res / values / strings.xml le fichier est une bonne pratique. Editez ce fichier pour qu'il ait le contenu suivant:
SMSReader Dernier SMS Aucun COMMENCEZ À PARLER ARRÊTE DE PARLER D'accord! Je vais lire vos messages à haute voix pour vous maintenant. D'accord! Je vais rester silencieux maintenant.
La plupart de ces chaînes sont utilisées dans l'étape suivante.
modifier res / layout / activity_main.xml d'ajouter ce qui suit:
Affichage
pour afficher le nom de la personne qui a envoyé le dernier SMSAffichage
pour afficher le contenu du dernier SMSBouton à bascule
activer / désactiver la sortie vocaleAprès avoir ajouté du code pour le positionnement et le style de ces éléments, votre fichier doit avoir le contenu suivant:
La mise en page de notre application est maintenant terminée.
Nous allons maintenant créer une classe d'assistance pour le moteur TTS. Créez une nouvelle classe Java et appelez-la Speaker.java. Cette classe est utilisée pour éviter d’appeler l’API TTS directement à partir du Activité
.
Cette classe implémente le OnInitListener
interface pour qu'il sache quand le moteur TTS est prêt. Nous stockons cet état prêt dans une variable booléenne nommée prêt
. Nous utilisons une autre variable booléenne nommée permis
dont la valeur est vrai
uniquement si l'utilisateur a autorisé le moteur TTS à parler. Nous ajoutons également des méthodes pour obtenir et définir la valeur de cette variable. À ce point, Speaker.java devrait avoir le contenu suivant:
public class Speaker implémente OnInitListener private TextToSpeech tts; booléen privé ready = false; booléen privé autorisé = faux; public Speaker (contexte de contexte) tts = new TextToSpeech (context, this); public boolean isAllowed () retour autorisé; public void allow (booléen autorisé) this.allowed = autorisé;
le OnInitListener
l'interface n'a qu'une méthode, onInit
. Cette méthode est appelée lorsque le moteur TTS a été initialisé. le statut
Ce paramètre nous permet de savoir si l’initialisation a réussi. Une fois que nous savons que l'initialisation a réussi, nous définissons le langage du moteur TTS. Ceci est important pour produire un discours qui soit compréhensible. Ajoutez le code suivant:
@Override public void onInit (int status) if (status == TextToSpeech.SUCCESS) // Modifiez cela pour qu'il corresponde à votre // locale locale tts.setLanguage (Locale.US); prêt = vrai; else ready = false;
Ensuite, nous ajoutons une méthode nommée parler
, qui utilise le moteur pour lire le texte qui lui est transmis. Auparavant, il vérifie si les deux permis
et le prêt
les valeurs sont vrai
. Le discours qu'il génère est placé dans le flux de notification.
public void speak (String text) // Ne parle que si le TTS est prêt // et que l'utilisateur a autorisé la parole si (prêt && autorisé) HashMaphash = new HashMap (); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (text, TextToSpeech.QUEUE_ADD, hash);
Nous ajoutons ensuite une méthode qui joue le silence pendant une durée spécifiée. En utilisant cette méthode, nous pouvons ajouter des pauses au discours pour le rendre un peu plus clair. Ajoutez le code suivant à l'implémentation:
pause publique vide (int duration) tts.playSilence (duration, TextToSpeech.QUEUE_ADD, null);
Enfin, ajoutez une méthode pour libérer des ressources lorsque le moteur TTS n’est plus nécessaire..
// Libérer des ressources public void destroy () tts.shutdown ();
modifier MainActivity.java et déclarer toutes les vues que nous avons mentionnées dans la mise en page. Déclarer deux entiers, LONGUE DURÉE
et COURTE DURÉE
. Ce ne sont que des valeurs qui sont transmises à la Orateur
de pause
méthode.
Aussi déclarer un CHECK_CODE
entier. Sa valeur n'est pas importante. Il est passé à la startActivityforResult
méthode et ensuite utilisé pour identifier le résultat.
Enfin, déclarez un Orateur
objet et un BroadcastReceiver
objet.
À ce stade, votre classe devrait ressembler à ceci:
La classe publique MainActivity étend Activity private final int CHECK_CODE = 0x1; int finale finale LONG_DURATION = 5000; finale privée int SHORT_DURATION = 1200; orateur privé; private ToggleButton bascule; private OnCheckedChangeListener toggleListener; TextView privé smsText; SMS privé TextView SMS; diffuseur privé smsReceiver;
Ajoutez une méthode pour vérifier si un moteur TTS est installé sur le périphérique. Le contrôle est effectué en utilisant le résultat d'un autre Activité
.
check vide privéTTS () Vérification de l'intention = nouvelle intention (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (cochez CHECK_CODE);
Quand le résultat de startActivityForResult
arrive, le onActivityResult
méthode est appelée. Par conséquent, nous devons le remplacer. Dans cette méthode, si le résultat est positif, on initialise le Orateur
objet. Si aucun moteur TTS n'est installé, nous redirigeons l'utilisateur pour l'installer..
@Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) if (requestCode == CHECK_CODE) if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) speaker = new Speaker (this); else Intention install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (installer);
Il est maintenant temps de créer notre BroadcastReceiver
traiter les messages que le périphérique reçoit. Chaque fois qu'il y a de nouveaux messages, ses onReceive
méthode est appelée. Nous analysons les messages, qui arrivent sous forme de tableaux d'octets, en utilisant le SmsMessage
classe. Une fois le message analysé, nous utilisons des méthodes telles que getDisplayMessageBody
et getOriginatingAddress
extraire des informations utiles.
Avec cette information, nous générons le texte que le moteur TTS doit lire. Nous nous arrêtons pour LONGUE DURÉE
avant de lire un nouveau SMS et pour COURTE DURÉE
entre les énoncés du nom de l'expéditeur du SMS et le corps du SMS.
Ajoutez le code suivant à l'implémentation:
private void initializeSMSReceiver () smsReceiver = new BroadcastReceiver () @Override public void onReceive (contexte de contexte, intention d'intention) bundle bundle = intent.getExtras (); if (bundle! = null) Object [] pdus = (Object []) bundle.get ("pdus"); pour (int i = 0; iNous pouvons uniquement extraire le numéro de téléphone de l'expéditeur du message. Pour mapper ce numéro sur le nom d'un contact, nous devons utiliser les contacts de l'utilisateur. La méthode suivante interroge les données de contacts. Si le numéro de téléphone n'est pas disponible dans les contacts de l'utilisateur, il renvoie simplement la chaîne.
numéro inconnu
:private String getContactName (Téléphone de chaîne) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (téléphone)); Projection de chaîne [] = new String [] ContactsContract.Data.DISPLAY_NAME; Curseur curseur = getContentResolver (). Query (uri, projection, null, null, null); if (cursor.moveToFirst ()) return cursor.getString (0); else retourne "nombre inconnu";Avant le
BroadcastReceiver
peut être utilisé, il doit être enregistré. Dans la méthode suivante, nous créons unIntentionFilter
pour les messages texte entrants, puis enregistrez notresmsReceiver
pour ça:private void registerSMSReceiver () IntentFilter intentFilter = new IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter);Ensuite, nous créons le
onCreate
méthode. Voici où nous initialisons tous les objets déclarés. Nous initialisons letoggleListener
pour définir la valeur depermis
dans leOrateur
classe.Après ces initialisations, nous appelons le
chèques
,initializeSMSReceiver
, etenregistrerSMSReceiver
les méthodes.@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); toggle = (ToggleButton) findViewById (R.id.speechToggle); smsText = (TextView) findViewById (R.id.sms_text); smsSender = (TextView) findViewById (R.id.sms_sender); toggleListener = new OnCheckedChangeListener () @Override public void onCheckedChanged (vue CompoundButton, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking)); else speaker.speak (getString (R.string.stop_speaking)); speaker.allow (false); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();Enfin, dans le
onDestroy
méthode d’activité, nous annulons l’enregistrement de notre récepteur et éteignons le moteur TTS pour libérer des ressources.@Override protected void onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy ();7. Exécuter et tester
L'application est maintenant prête à être testée. Compilez-le et exécutez-le sur un périphérique Android physique. Appuyez sur le bouton pour activer la voix et envoyez-vous un SMS depuis un autre téléphone ou demandez à un de vos amis de le faire. Vous devriez bientôt pouvoir entendre votre téléphone lire le SMS pour vous.
Voici un exemple du discours généré par le moteur TTS:
Conclusion
Dans ce didacticiel, vous avez appris non seulement à utiliser l'API text-to-speech, mais également à utiliser des récepteurs de diffusion et à donner un sens aux données SMS brutes. Vous pouvez maintenant continuer à personnaliser davantage cette application selon vos besoins..