Utilizați Text-to-Speech pe Android pentru a citi mesajele primite

Aplicațiile cu interfețe care utilizează vocea au un apel unic. Ei tind să-i facă pe utilizatori să simtă că folosesc ceva futurist. Începând cu primele sale zile, Android are o funcționalitate foarte robustă în format text-to-speech (TTS). În acest an, Google a adăugat o mulțime de voci de înaltă calitate pentru motorul său TTS și acesta este cu atât mai mult motiv pentru dezvoltatori să-l folosească în aplicațiile lor.

În acest tutorial, veți afla cum să creați o aplicație simplă - cu o interfață minimalistă de utilizator - care să poată primi mesaje text și să le citească utilizatorului.

Cerințe preliminare

Asigurați-vă că aveți setul de pachete ADT Eclipse. Puteți să o descărcați de pe site-ul Android Developer. Pentru cele mai bune rezultate, veți avea de asemenea nevoie de un dispozitiv Android real și de unii prieteni care vă pot trimite mesaje text.

1. Creați un proiect nou

Porniți Eclipse și creați o nouă aplicație Android. Apelați această aplicație SMSReader. Dacă credeți că veți publica această aplicație în Google Play pentru ao distribui prietenilor dvs., asigurați-vă că utilizați un nume de pachet unic. Seteaza SDK minim necesar la Android 2.2 și setați SDK destinație la Android 4.4.

Această aplicație va avea una Activitate. Selectați Creați activitate și alegeți Activitate goală.

Numeste Activitate principala și faceți clic pe finalizarea.

2. Editați Manifestul

Această aplicație are nevoie de trei permisiuni:

  • RECEIVE_SMS să știți că dispozitivul a primit un SMS
  • READ_SMS pentru a citi acel SMS
  • READ_CONTACTS pentru a mapa numărul de telefon al expeditorului la un nume (dacă este posibil)

Adăugați următoarele linii la dvs. AndroidManifest.xml.

  

Această aplicație va avea doar o singură orientare pe ecran, portret. Prin urmare, editați activitate și adăugați următorul atribut:

Android: screenOrientation = "portret"

Manifestul este acum complet.

3. Editați strings.xml

Nu este absolut necesar, ci stocarea tuturor șirurilor pe care aplicația le folosește în res / valori / strings.xml fișierul este o practică bună. Editați acest fișier astfel încât acesta să aibă următorul conținut:

  SMSReader Ultimele SMS-uri Nici unul START SPEAKING OPRIȚI STOPUL Bine! Îți voi citi mesajele cu voce tare pentru tine acum. Bine! Voi rămâne tăcut acum. 

Cele mai multe dintre aceste șiruri sunt folosite în etapa următoare.

4. Editați aspectul

Editați | × res / aspect / activity_main.xml pentru a adăuga următoarele:

  • TextView pentru a afișa numele persoanei care a trimis cel mai recent SMS
  • TextView pentru a afișa conținutul ultimului SMS
  • Buton de comutare pentru a activa și a dezactiva ieșirea de vorbire

După adăugarea codului pentru poziționarea și styling-ul acestor elemente, fișierul dvs. trebuie să aibă următorul conținut:

    

Structura aplicației noastre este acum completă.

5. Creați o clasă Helper

Acum vom crea o clasă de ajutor pentru motorul TTS. Creați o nouă clasă Java și apelați-o Speaker.java. Această clasă este folosită pentru a evita suna API-ul TTS direct din Activitate.

Această clasă implementează OnInitListener astfel încât să știe când motorul TTS este gata. Stocăm această stare gata într-o variabilă booleană denumită gata. Folosim o altă variabilă booleană denumită permis a căror valoare este Adevărat numai dacă utilizatorul a permis motorului TTS să vorbească. De asemenea, adăugăm metode pentru a obține și seta valoarea acestei variabile. In acest punct, Speaker.java ar trebui să aibă următorul conținut:

public vorbitor de clasă implementează OnInitListener private TextToSpeech tts; boolean privat gata = fals; boolean privat permis = fals; speaker public (Contextul contextului) tts = new TextToSpeech (context, this);  boolean public isAllowed () retur permis;  void public allow (permite boolean) this.allowed = allowed; 

OnInitListener interfața are o singură metodă, onInit. Această metodă se numește atunci când motorul TTS a fost inițializat. stare parametru ne permite să știm dacă inițializarea a avut succes. După ce știm că inițializarea a avut succes, am setat limba motorului TTS. Acest lucru este important pentru a produce un discurs inteligibil. Adăugați următorul cod:

@Override public void onInit (starea int) if (status == TextToSpeech.SUCCESS) // Schimba acest lucru pentru a se potrivi cu // locale tts.setLanguage (Locale.US); gata = adevărată;  altfel ready = false; 

Apoi, adăugăm o metodă numită vorbi, care utilizează motorul pentru a citi orice text care îi este transmis. Înainte de a face acest lucru, verifică dacă ambele permis si gata valorile sunt Adevărat. Discursul pe care îl generează este plasat în fluxul de notificare.

public void vorbesc (String text) / / Vorbesc numai dacă TTS este gata // și utilizatorul a permis vorbește dacă (gata && este permisă) HashMap hash = nou HashMap(); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (text, TextToSpeech.QUEUE_ADD, hash); 

Apoi adăugăm o metodă care interpretează tăcerea pentru o anumită durată. Folosind această metodă, putem adăuga pauze la discurs pentru a vă face să sună puțin mai clar. Adăugați următorul cod la implementare:

pauza publică void (durata int) tts.playSilence (duration, TextToSpeech.QUEUE_ADD, null); 

În cele din urmă, adăugați o metodă de eliberare a resurselor atunci când motorul TTS nu mai este necesar.

// Creați resurse publice void destroy () tts.shutdown (); 

6. Editați clasa de activitate

Editați | × MainActivity.java și să declare toate punctele de vedere pe care le-am menționat în plan. Declarați două numere întregi, DURATA LUNGA și DURATA SCURTA. Acestea sunt doar valori care sunt transmise vorbitor„s pauză metodă.

De asemenea, declarați a CHECK_CODE întreg. Valoarea nu este importantă. Este trecut la startActivityforResult și apoi folosite pentru a identifica rezultatul.

În cele din urmă, declară a vorbitor obiect și a BroadcastReceiver obiect.

În acest moment, clasa dvs. ar trebui să arate astfel:

clasa publica MainActivity extinde Activitatea private final int CHECK_CODE = 0x1; finală privată int LONG_DURATION = 5000; finală privată int SHORT_DURATION = 1200; vorbitor privat de difuzor; contul ToggleButton privat; privat OnCheckedChangeListener toggleListener; private TextView smsText; private TextView smsSender; privat BroadcastReceiver smsReceiver; 

Adăugați o metodă pentru a verifica dacă un dispozitiv TTS este instalat pe dispozitiv. Verificarea este efectuată utilizând rezultatul altui Activitate.

private void checkTTS () Controlul intenției = intenția nouă (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (verificați, CHECK_CODE); 

Când rezultatul startActivityForResult sosesc, onActivityResult se numește metoda. Prin urmare, trebuie să o ignorăm. În această metodă, dacă rezultatul este pozitiv, inițializăm vorbitor obiect. Dacă nu este instalat niciun motor TTS, redirecționăm utilizatorul pentru al instala.

@Override protejat void onActivityResult (int requestCode, int resultCode, date intenționate) if (requestCode == CHECK_CODE) if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) difuzor = speaker new (this);  altfel Intent install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (instalare); 

Acum este momentul să ne creăm BroadcastReceiver pentru a rezolva mesajele pe care dispozitivul le primește. Ori de câte ori există mesaje noi, ei onReceive se numește metoda. Noi analizăm mesajele, care sosesc ca arhitecturi de octeți, folosind SmsMessage clasă. Odată ce mesajul este analizat, folosim metode precum getDisplayMessageBody și getOriginatingAddress pentru a extrage din ea informații importante.

Cu aceste informații, generăm textul pe care motorul TTS ar trebui să îl citească. Pauzăm pentru DURATA LUNGA înainte de a citi un SMS nou și pentru DURATA SCURTA între declarațiile date de numele expeditorului SMS și corpul SMS-ului.

Adăugați următorul cod la implementare:

privat void initializeSMSReceiver () smsReceiver = nou BroadcastReceiver () @Override public void onReceive (Contextul contextului, intenția intenției) Bundle bundle = intent.getExtras (); dacă (pachet! = null) Obiect [] pdus = (Obiect []) bundle.get ("pdus"); pentru (int i = 0; i

Putem extrage numai numărul de telefon al expeditorului din mesaj. Pentru a mapa acest număr pe numele unui contact, trebuie să utilizăm contactele utilizatorului. Următoarea metodă interoghează datele de contact. Dacă numărul de telefon nu este disponibil în contactele utilizatorului, acesta returnează pur și simplu șirul numar necunoscut:

String privat getContactName (Telefon cu șir) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (telefon)); Proiectarea șirului de caractere [] = nou String [] ContactsContract.Data.DISPLAY_NAME; Cursor cursor = getContentResolver () interogare (uri, proiecție, null, null, null); dacă (cursor.moveToFirst ()) retur cursor.getString (0);  altceva return "număr necunoscut"; 

Inainte de BroadcastReceiver poate fi folosit, trebuie să fie înregistrată. În următoarea metodă, creăm un IntentFilter pentru mesajele text primite și apoi înregistrați-ne smsReceiver pentru asta:

registrul void privatSMSReceiver () IntentFilter intentFilter = noul IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter); 

Apoi, vom crea onCreate metodă. Iată unde inițializăm toate obiectele pe care le-am declarat. Inițializăm toggleListener pentru a seta valoarea permis în vorbitor clasă.

După aceste inițializări, numim checkTTS, initializeSMSReceiver, și registerSMSReceiver metode.

@Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); comutare = (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 (Vizualizare compusăButton, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking));  altceva speaker.speak (getString (R.string.stop_speaking)); speaker.allow (false); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();  

În cele din urmă, în onDestroy metoda de activitate, ne deblocăm receptorul și închidem motorul TTS pentru a elibera resursele.

@Override protejate void onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy (); 

7. Rulați și testați

Aplicația este acum gata să fie testată. Compilați-l și rulați-l pe un dispozitiv fizic Android. Atingeți butonul de comutare pentru a activa vocea și pentru a vă trimite un SMS de la un alt telefon sau pentru a întreba unul dintre prietenii dvs. să facă acest lucru. Ar trebui în curând să puteți auzi telefonul pentru a citi SMS-ul pentru dvs..

Iata un exemplu de discurs generat de motorul TTS:

Concluzie

În acest tutorial, ați învățat să nu utilizați numai API text-to-speech, ci și să utilizați receptoare de radiodifuziune și să înțelegeți datele brute SMS. Acum puteți continua să personalizați în continuare această aplicație la nevoile dvs..

Cod