Bruk tekst til tale på Android for å lese ut innkommende meldinger

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.

Forutsetninger

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.

1. Lag et nytt prosjekt

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.

2. Rediger manifestet

Denne appen trenger tre tillatelser:

  • RECEIVE_SMS å vite at enheten har mottatt en SMS
  • READ_SMS å lese det SMS
  • READ_CONTACTS å kartlegge avsenderens telefonnummer til et navn (hvis mulig)

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.

3. Rediger strings.xml

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.

4. Rediger oppsettet

Redigere res / layout / activity_main.xml for å legge til følgende:

  • en TextView for å vise navnet til personen som sendte den siste SMS-meldingen
  • en TextView for å vise innholdet i den siste SMS-meldingen
  • en ToggleButton for å slå taleutgang på og av

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

5. Opprett en hjelpeklasse

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) HashMap hash = 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 (); 

6. Rediger Aktivitetsklassen

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; i

Vi 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 en IntentFilter for innkommende tekstmeldinger og registrer deretter vår smsReceiver 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 initialiserer toggleListener å angi verdien av tillatt i Høyttaler klasse.

Etter disse initialiseringene kaller vi checkTTS, initializeSMSReceiver, og registerSMSReceiver 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.