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.
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.
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.
Această aplicație are nevoie de trei permisiuni:
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.
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.
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 SMSTextView
pentru a afișa conținutul ultimului SMSButon de comutare
pentru a activa și a dezactiva ieșirea de vorbireDupă 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ă.
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ă) HashMaphash = 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 ();
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; iPutem 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 unIntentFilter
pentru mesajele text primite și apoi înregistrați-nesmsReceiver
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ămtoggleListener
pentru a seta valoareapermis
învorbitor
clasă.După aceste inițializări, numim
checkTTS
,initializeSMSReceiver
, șiregisterSMSReceiver
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..