Use Tekst-til-tale på Android å lese ut innkommende meldinger
28
Del
9
Del
Dette Cyber Mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Apps med grensesnitt som gjør bruk av stemmen har en unik appell. De har en tendens til å gjøre sine brukere føler at de bruker noe futuristisk. Siden sine tidlige dager, har Android hadde svært robust tekst-til-tale (TTS) funksjonalitet. I år har Google lagt mye av høykvalitets stemmer til sin TTS-motoren, og det er alle de mer grunn for utviklere å bruke det i sine apps.
I denne opplæringen vil du lære hvordan du oppretter en enkel app-med et minimalistisk brukergrensesnitt-som kan motta tekstmeldinger og lese dem for brukeren.
Forutsetninger
Sørg for at du har Eclipse ADT Bundle satt opp. Du kan laste det ned på Android Developer nettstedet. For best resultat, er du også kommer til å trenge en skikkelig Android-enhet og noen venner som kan sende deg tekstmeldinger.
1. Opprett et nytt prosjekt
Komme Eclipse, og opprette en ny Android-applikasjon. Kalle dette programmet SMSReader. Hvis du tror du kommer til å publisere denne app til Google Play for å dele den med dine venner, så sørg for at du bruker et unikt pakkenavn. Sett minstekravet SDK til Android 2.2 og sette Target SDK til Android 4.4.
Denne applikasjonen vil ha en aktivitet. Velg Opprett Aktivitet og velger Tøm aktivitet.
Name it MainActivity og klikk Fullfør.
2. Redigere Manifest
Denne applikasjonen trenger tre tillatelser:
RECEIVE_SMS å vite at enheten har mottatt en SMS
READ_SMS å lese at SMS
READ_CONTACTS å kartlegge telefonnummeret til avsenderen til et navn (hvis mulig)
<
< p> Legg til følgende linjer i din AndroidManifest.xml, bruker-tillatelse android. navn = "android.permission.READ_SMS" /> < bruker-tillatelse android: name = "android.permission.RECEIVE_SMS" /> < bruker-tillatelse android: name = "android.permission.READ_CONTACTS" /> < p> Dette programmet kommer til å ha bare én skjermretning, portrett. Derfor redigere aktiviteten tag og legge følgende attributt til det:
android: screenOrientation = "portrett"
Manifestet er nå fullført
3.. Edit strings.xml
Det er ikke absolutt nødvendig, men lagring av alle strenger som programmet bruker i res /verdier /strings.xml fil er en god praksis. Rediger denne filen slik at den har følgende innhold:??
≪ xml version = "1.0" encoding = "UTF-8" > < ressurser > < string name = "APP_NAME" > SMSReader < /string > < string name = "sms_label" > Siste SMS < /string > < string name = "ingen" > Ingen < /string > < string name = "speech_toggle_on" > begynner å snakke < /string > < string name = "speech_toggle_off" > slutte å snakke < /string > < string name = "start_speaking" > Ok! Jeg vil lese meldingene dine høyt for deg nå. ≪ /string > < string name = "stop_speaking" > Ok! Jeg vil være stille nå. ≪ /string > < /ressurser >
De fleste av disse strengene blir brukt i neste trinn
4.. Redigere Layout
Rediger res /layout /activity_main.xml å legge til følgende:
a TextView å vise navnet på personen som sendte den siste SMS
a TextView å vise innholdet i den siste SMS
a ToggleButton å veksle talen av og på
Etter å legge koden for posisjonering og styling disse elementene, din fil bør ha følgende innhold:
< RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android~~number=plural" xmlns: verktøy = "http://schemas.android.com/tools" android: layout_width = "match_parent" Android: layout_height = "match_parent" verktøy: kontekst = "$ {pakke} $ {activityClass}." android: bakgrunn = "# 99CC00" > < TextView android: id = "+ id /sms_sender" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignParentTop = "true" android: layout_centerHorizontal = "true" android: layout_marginTop = "20dp" android "? android: attr /textAppearanceSmall": text = "@ streng /sms_label" android:: textcolor = "# ffffff" android textAppearance = /> < TextView android: id = "+ id /sms_text" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_below = "+ id /sms_sender" android: layout_centerHorizontal = "true" android: layout_marginTop = "10dp" android: text = "@ streng /ingen" android: textAppearance =: android: textcolor = "# ffffff" /> "android attr /textAppearanceLarge?" < ToggleButton android: id = "+ id /speechToggle" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_centerHorizontal = "true" android: layout_centerVertical = "true" android: textOff = "@ streng /speech_toggle_on "android: textOn =" @ streng /speech_toggle_off "/> < /RelativeLayout >
Oppsettet for søknaden vår er nå fullført
5.. Lag en Helper Class
Vi overvåker nå skal lage en hjelper klasse for TTS-motoren. Opprett en ny Java-klassen og kaller det Speaker.java. Denne klassen benyttes for å unngå å ringe TTS API direkte fra aktiviteten.
Denne klassen implementerer OnInitListener grensesnitt, slik at den vet når TTS-motoren er klar. Vi lagrer denne klar stat i en boolsk variabel kalt klar. Vi bruker en annen boolsk variabel kalt tillatt der verdien er sant bare hvis brukeren har lov til TTS-motoren til å snakke. Vi legger også til metoder for å få og sette verdien av denne variabelen. På dette punktet, bør Speaker.java har følgende innhold:
public class Speaker implementerer OnInitListener {private TextToSpeech TTS; private boolean klar = false; private boolean lov = false; offentlig Speaker (Context kontekst) {TTS = new TextToSpeech (kontekst, dette); } Public boolean isAllowed () {return tillatt; } Public void tillate (boolsk tillatt) {this.allowed = tillatt; }}
OnInitListener grensesnittet har kun én metode, onInit. Denne metoden kalles når TTS-motoren er initialisert. Statusen parameter lar oss få vite om initialisering var vellykket. Når vi vet at initial var vellykket, setter vi språket i TTS-motoren. Dette er viktig for å produsere tale som er forståelig. Legg til følgende kode:
Overridepublic void onInit (int status) {if (status == TextToSpeech.SUCCESS) {//Endre dette til å matche din //locale tts.setLanguage (Locale.US); klar = true; } else {klar = false; }}
Deretter legger vi en metode som heter tale, som bruker motoren til å lese ut noen tekst som er gått til det. Før du gjør det, sjekker den om både lov og klare verdier er sant. Talen den genererer er plassert i systemstatusfeltet stream
public void speak (String tekst) {//Snakk bare hvis TTS er klar //og brukeren har tillatt tale om. (Klar & & lov) {HashMap < String, String > hash = new HashMap < String, String > (); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (tekst, TextToSpeech.QUEUE_ADD, hash); }}
Vi deretter legge til en metode som spiller stillhet i en angitt periode. Ved hjelp av denne metoden, kan vi legge inn pauser i talen å gjøre det høres litt klarere. Legg til følgende kode i gjennomføringen:
public void pause (int varighet) {tts.playSilence (varighet, TextToSpeech.QUEUE_ADD, null);}
Til slutt legger du en metode for å frigjøre ressurser når TTS-motoren er ikke lenger nødvendig
//Frigjør resourcespublic void ødelegge () {tts.shutdown ();}.
6. Redigere Aktivitetsklasse
Rediger MainActivity.java og fortelle om alle de synspunkter som vi nevnte i oppsettet. Erklære to heltall, LONG_DURATION og SHORT_DURATION. Dette er bare verdier som er gått til den som snakker pause metode.
erklære Også en CHECK_CODE heltall. Det er verdi er ikke viktig. Det er gått over til startActivityforResult metode og deretter brukes til å identifisere resultatet.
Til slutt, erklærer en høyttaler objekt og en BroadcastReceiver objekt.
På dette punktet, klassen din skal se ut dette:
public class MainActivity strekker Aktivitet {private final int CHECK_CODE = 0x1; private final int LONG_DURATION = 5000; private final int SHORT_DURATION = 1200; private Speaker høyttalere; private ToggleButton veksle; private OnCheckedChangeListener toggleListener; private TextView smsText; private TextView smsSender; private BroadcastReceiver smsReceiver;}
Legg til en metode for å sjekke om en TTS-motoren er installert på enheten. Sjekken utføres ved å gjøre bruk av 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 kommer, den onActivityResult metoden kalles. Derfor trenger vi å overstyre den. I denne metoden, hvis resultatet er positivt, initial vi Speaker objektet. Hvis ingen TTS-motoren er installert, omdirigere vi brukeren til å installere den.
Overrideprotected Void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == CHECK_CODE) {if (resultCode == TextToSpeech.Engine. CHECK_VOICE_DATA_PASS) {høyttaler = new Speaker (denne); } else {Intent installere = 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 dens OnReceive metode som kalles. Vi analysere meldingene, som kommer som byte arrays, ved hjelp av SmsMessage klassen. Når meldingen er analysert, vi bruker metoder som getDisplayMessageBody og getOriginatingAddress å trekke meningsfull informasjon ut av det.
Med denne informasjonen, genererer vi teksten som TTS-motoren bør lese ut. Vi stopper opp for LONG_DURATION før du leser ut en ny SMS og for SHORT_DURATION mellom ytringer på SMS avsenderens navn og SMS kropp
Legg til følgende kode i gjennomføringen.
Private void initializeSMSReceiver ( ) {smsReceiver = new BroadcastReceiver () {Override public void OnReceive (Context kontekst, Intent hensikt) {Bundle bunt = intent.getExtras (); if (! = null bundle) {Object [] PDU = (Object []) bundle.get ("PDU"); for (int i = 0; i < pdus.length; i ++) {byte [] PDU = (byte []) pdus [i]; SmsMessage melding = SmsMessage.createFromPdu (PDU); String tekst = message.getDisplayMessageBody (); String avsender = getContactName (message.getOriginatingAddress ()); speaker.pause (LONG_DURATION); speaker.speak ("Du har en ny melding fra" + avsender + "!"); speaker.pause (SHORT_DURATION); speaker.speak (tekst); smsSender.setText ("Melding fra" + avsender); smsText.setText (tekst); }}}}; }
Vi kan bare trekke ut telefonnummeret til avsenderen fra meldingen. For å kartlegge dette nummeret til en kontakt navn, har vi å gjøre bruk av brukerens kontakter. Følgende metode spør kontaktdata. Hvis telefonnummeret ikke er tilgjengelig i brukerens kontakter, så er det bare returnerer strengen ukjent antall:
private String getContactName (String telefon) {Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (telefon)); String projeksjon [] = new String [] {ContactsContract.Data.DISPLAY_NAME}; Pekeren peker = getContentResolver () spørring (uri, projeksjon, null, null, null.); if (cursor.moveToFirst ()) {return cursor.getString (0); } else {return "ukjent nummer"; }}
Før BroadcastReceiver kan brukes, må det være registrert. I det følgende metode, skaper vi en IntentFilter for innkommende tekstmeldinger og deretter registrere vår smsReceiver for det:
private void registerSMSReceiver () {IntentFilter intentFilter = new IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter);}
Deretter oppretter vi onCreate metoden. Her er der vi stille alle objektene vi erklært. Vi initialisere toggleListener å sette verdien av tillatt i Speaker klassen.
Etter disse initializations, kaller vi de checkTTS, initializeSMSReceiver og registerSMSReceiver metoder.
Overrideprotected 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 = new OnCheckedChangeListener () {Override public void onCheckedChanged (CompoundButton visning, boolsk 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 ();}
Til slutt, i onDestroy metode for aktiviteten, avregistrere vi vår mottakeren og slå av TTS-motoren for å frigjøre ressurser
Overrideprotected void onDestroy () {super.onDestroy (.); unregisterReceiver (smsReceiver); speaker.destroy ();}
7. Kjør og Test
Programmet er nå klar til å bli testet. Kompilere og kjøre den på en fysisk Android-enhet. Trykk på veksleknappen for å aktivere stemme og sende deg en SMS fra en annen telefon eller be en av vennene dine til å gjøre det. Du bør snart være i stand til å høre telefonen lese opp SMS for deg
Her er et utvalg av talen generert av TTS-motoren.
Konklusjon
I denne opplæringen, har du lært å ikke bare bruke tekst-til-tale-API, men også å bruke mottakere for kringkasting og til fornuftig ut av rå SMS data. Nå kan du gå på å tilpasse videre denne applikasjonen til du trenger.