Apper med grensesnitt som benytter stemme har en unik appell. De pleier å få brukerne til å føle at de bruker noe futuristisk. Siden begynnelsen har Android hatt svært robust tekst-til-tale (TTS) -funksjonalitet. I år har Google lagt til mange høyverdige stemmer til sin TTS-motor, og det er enda mer grunn for at utviklere bruker det i sine apper.
I denne veiledningen lærer du hvordan du lager en enkel app, med et minimalistisk brukergrensesnitt, som kan motta tekstmeldinger og lese dem til brukeren.
Kontroller at du har Eclipse ADT Bundle satt opp. Du kan laste den ned på Android Developer-nettstedet. For best resultat trenger du også en ekte Android-enhet og noen venner som kan sende deg tekstmeldinger.
Start Eclipse, og opprett et nytt Android-program. Ring dette programmet SMSReader. Hvis du tror at du skal publisere denne appen til Google Play for å dele den med vennene dine, må du sørge for at du bruker et unikt pakkenavn. Sett Minimumskrav SDK til Android 2.2 og sett Mål SDK til Android 4.4.
Denne appen vil ha en Aktivitet
. Å velge Opprett aktivitet og velg Tom aktivitet.
Navngi det Hoved aktivitet og klikk Bli ferdig.
Denne appen trenger tre tillatelser:
Legg til følgende linjer i din AndroidManifest.xml.
Denne appen har bare en skjermorientering, portrett. Rediger derfor aktivitet
tag og legg til følgende attributt til det:
android: screenOrientation = "portrett"
Manifestet er nå fullført.
Det er ikke helt nødvendig, men lagrer alle strenge som applikasjonen bruker i res / verdier / strings.xml filen er en god praksis. Rediger denne filen slik at den har følgende innhold:
SMSReader Siste SMS Ingen STARTPRØKNING STOPP SPEAKING Greit! Jeg vil lese meldingene dine høyt for deg nå. Greit! Jeg vil være stille nå.
De fleste av disse strengene brukes i neste trinn.
Redigere res / layout / activity_main.xml for å legge til følgende:
TextView
for å vise navnet til personen som sendte den siste SMS-meldingenTextView
for å vise innholdet i den siste SMS-meldingenToggleButton
for å slå taleutgang på og avEtter at du har lagt til kode for posisjonering og styling av disse elementene, skal filen ha følgende innhold:
Oppsettet for søknaden vår er nå ferdig.
Vi skal nå lage en hjelpeklasse for TTS-motoren. Opprett en ny Java-klasse og ring den Speaker.java. Denne klassen brukes til å unngå å ringe TTS API direkte fra Aktivitet
.
Denne klassen implementerer OnInitListener
grensesnitt slik at det vet når TTS-motoren er klar. Vi lagrer denne klare tilstanden i en boolsk variabel som heter klar
. Vi bruker en annen boolsk variabel som heter tillatt
hvis verdi er ekte
bare hvis brukeren har tillatt TTS-motoren å snakke. Vi legger også til metoder for å få og angi verdien av denne variabelen. På dette punktet, Speaker.java bør ha følgende innhold:
Public Class Speaker implementerer OnInitListener private TextToSpeech tts; privat booleansk klar = false; privat boolean tillatt = false; offentlig høyttaler (kontekst kontekst) tts = new TextToSpeech (kontekst, dette); offentlig boolean isAllowed () return allowed; offentlig tomgang tillate (boolean tillatt) this.allowed = allowed;
De OnInitListener
grensesnittet har bare én metode, onInit
. Denne metoden kalles når TTS-motoren er initialisert. De status
parameteren forteller oss om initieringen var vellykket. Når vi vet at initialiseringen var vellykket, satte vi språket til TTS-motoren. Dette er viktig for å produsere tale som er forståelig. Legg til følgende kode:
@Override public void onInit (int status) if (status == TextToSpeech.SUCCESS) // Endre dette for å matche din // locale tts.setLanguage (Locale.US); klar = sant; ellers klar = false;
Deretter legger vi til en metode som heter snakke
, som bruker motoren til å lese ut noen tekst som er sendt til den. Før det gjøres, sjekker det om begge deler tillatt
og klar
verdiene er ekte
. Talen den genererer er plassert i varslingsstrømmen.
Offentlig tomtale (String text) // Snakk bare hvis TTS er klar // og brukeren har tillatt tale hvis (klar && tillatt) HashMaphash = nytt HashMap (); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (tekst, TextToSpeech.QUEUE_ADD, hash);
Vi legger til en metode som spiller stil i en bestemt varighet. Ved hjelp av denne metoden kan vi legge til pause i talen for å få det til å lyde litt klarere. Legg til følgende kode for implementeringen:
offentlig tomgangspause (int varighet) tts.playSilence (varighet, TextToSpeech.QUEUE_ADD, null);
Til slutt legger du til en metode for å frigjøre ressurser når TTS-motoren ikke lenger er nødvendig.
// Frigjør ressurser offentlig tomt ødelegge () tts.shutdown ();
Redigere MainActivity.java og erklære alle synspunkter som vi nevnte i oppsettet. Erklære to heltall, LONG_DURATION
og SHORT_DURATION
. Disse er bare verdier som sendes til Høyttaler
's pause
metode.
Erklære også a CHECK_CODE
heltall. Det er verdien er ikke viktig. Det blir sendt til startActivityforResult
metode og deretter brukes til å identifisere resultatet.
Til slutt, erklære a Høyttaler
objekt og a BroadcastReceiver
gjenstand.
På dette tidspunktet bør din klasse se slik ut:
offentlig klasse MainActivity utvider Aktivitet privat endelig int CONTROL_CODE = 0x1; privat endelig int LONG_DURATION = 5000; privat endelig int SHORT_DURATION = 1200; privat høyttaler høyttaler; privat ToggleButton bytt; privat OnCheckedChangeListener toggleListener; privat tekstvisning smsText; privat TextView smsSender; privat BroadcastReceiver smsReceiver;
Legg til en metode for å sjekke om en TTS-motor er installert på enheten. Tjekken utføres ved å benytte resultatet av en annen Aktivitet
.
private void checkTTS () Intent check = new Intent (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (sjekk, CHECK_CODE);
Når resultatet av startActivityForResult
ankommer, den onActivityResult
Metoden kalles. Derfor må vi overstyre den. I denne metoden, hvis resultatet er positivt, initialiserer vi Høyttaler
gjenstand. Hvis ingen TTS-motor er installert, omdirigerer vi brukeren til å installere den.
@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) hvis (requestCode == CHECK_CODE) hvis (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) speaker = new Speaker (this); else Intent install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (installere);
Det er nå på tide å lage vår BroadcastReceiver
å håndtere meldingene som enheten mottar. Når det er nye meldinger, er det OnReceive
Metoden kalles. Vi analyserer meldingene, som kommer som byte arrays, ved hjelp av SmsMessage
klasse. Når meldingen er analysert, bruker vi metoder som getDisplayMessageBody
og getOriginatingAddress
å trekke ut meningsfull informasjon ut av det.
Med denne informasjonen genererer vi teksten som TTS-motoren skal lese ut. Vi pause for LONG_DURATION
før du leser ut en ny SMS og for SHORT_DURATION
mellom uttalene til SMS-avsenderens navn og sms'ens kropp.
Legg til følgende kode for implementeringen:
private void initializeSMSReceiver () smsReceiver = ny BroadcastReceiver () @Override public void onReceive (Kontekst kontekst, hensikt) Bundle bundle = intent.getExtras (); hvis (pakke! = null) Objekt [] pdus = (Objekt []) bundle.get ("pdus"); for (int i = 0; iVi kan bare trekke ut telefonnummeret til avsenderen fra meldingen. For å kartlegge dette nummeret til en kontaktens navn må vi gjøre bruk av brukerens kontakter. Følgende metode spørrer kontaktdataene. Hvis telefonnummeret ikke er tilgjengelig i brukerens kontakter, returnerer det bare strengen
ukjent nummer
:Private String getContactName (String-telefon) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (telefon)); Stringprojeksjon [] = ny String [] ContactsContract.Data.DISPLAY_NAME; Markørmarkør = getContentResolver (). Spørring (uri, projeksjon, null, null, null); hvis (cursor.moveToFirst ()) return cursor.getString (0); ellers returnere "ukjent nummer";Før
BroadcastReceiver
kan brukes, den må registreres. I den følgende metoden lager vi enIntentFilter
for innkommende tekstmeldinger og registrer deretter vårsmsReceiver
for det:privat tomt registerSMSReceiver () IntentFilter intentFilter = ny IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter);Deretter lager vi
onCreate
metode. Her er hvor vi initialiserer alle objektene vi erklærte. Vi initialiserertoggleListener
å angi verdien avtillatt
iHøyttaler
klasse.Etter disse initialiseringene kaller vi
checkTTS
,initializeSMSReceiver
, ogregisterSMSReceiver
fremgangsmåter.@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); veksle = (ToggleButton) findViewById (R.id.speechToggle); smsText = (TextView) findViewById (R.id.sms_text); smsSender = (TextView) findViewById (R.id.sms_sender); toggleListener = ny OnCheckedChangeListener () @Overtrid offentlig tomgang påCheckedChanged (CompoundButton-visning, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking)); ellers speaker.speak (getString (R.string.stop_speaking)); speaker.allow (false); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();Til slutt, i
onDestroy
Metode for aktiviteten, vi avregistrerer vår mottaker og slår av TTS-motoren for å frigjøre ressurser.@Override protected void onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy ();7. Kjør og test
Appen er nå klar til å bli testet. Kompilere og kjøre den på en fysisk Android-enhet. Trykk på tasten for å aktivere stemme og send deg en SMS fra en annen telefon, eller be en av vennene dine om å gjøre det. Du bør snart kunne høre telefonen lese SMS-meldingen for deg.
Her er et eksempel på talen som genereres av TTS-motoren:
Konklusjon
I denne opplæringen har du lært å ikke bare bruke tekst-til-tale-API, men også å bruke kringkasting mottakere og fornuftig ut av rå SMS-data. Du kan nå fortsette å tilpasse denne appen til dine behov.