Appar med gränssnitt som använder sig av röst har en unik överklagande. De tenderar att få sina användare att känna att de använder något futuristiskt. Sedan dess tidiga dagar har Android haft mycket robust text-till-tal (TTS) -funktionalitet. I år har Google lagt till många högkvalitativa röster till sin TTS-motor och det är allt mer anledning för utvecklare att använda det i sina appar.
I denna handledning lär du dig att skapa en enkel app med ett minimalistiskt användargränssnitt som kan ta emot textmeddelanden och läsa dem till användaren.
Se till att du har Eclipse ADT Bundle. Du kan ladda ner den på Android Developer-webbplatsen. För bästa resultat behöver du också en riktig Android-enhet och några vänner som kan skicka textmeddelanden.
Starta Eclipse och skapa en ny Android-applikation. Ring denna ansökan SMSReader. Om du tror att du ska publicera den här appen till Google Play för att dela den med dina vänner, se till att du använder ett unikt paketnamn. Ställ in Minimikrav SDK till Android 2.2 och ställa in Mål SDK till Android 4.4.
Den här appen kommer att ha en Aktivitet
. Välj Skapa aktivitet och välj Tom aktivitet.
Namnge det Huvudaktivitet och klicka Avsluta.
Den här appen behöver tre behörigheter:
Lägg till följande rader i din AndroidManifest.xml.
Den här appen har bara en skärmorientering, porträtt. Redigera därför aktivitet
tagga och lägg till följande attribut till det:
android: screenOrientation = "porträtt"
Manifestet är nu klart.
Det är inte absolut nödvändigt, men lagrar alla strängar som applikationen använder i res / värden / strings.xml filen är en bra övning. Redigera den här filen så att den har följande innehåll:
SMSReader Senaste SMS Ingen STARTPRESSNING STOPP SPEAKING Okej! Jag kommer läsa dina meddelanden högt för dig nu. Okej! Jag kommer att vara tyst nu.
De flesta av dessa strängar används i nästa steg.
Redigera res / layout / activity_main.xml att lägga till följande:
Textview
för att visa namnet på den person som skickade det senaste SMSTextview
för att visa innehållet i det senaste SMSVäxlingsknapp
för att växla talutgången till och frånEfter att du har lagt till kod för positionering och styling av dessa element måste din fil ha följande innehåll:
Layouten för vår ansökan är nu klar.
Vi ska nu skapa en hjälpklass för TTS-motorn. Skapa en ny Java-klass och ring den Speaker.java. Denna klass används för att undvika att ringa TTS API direkt från Aktivitet
.
Den här klassen implementerar OnInitListener
gränssnittet så att det vet när TTS-motorn är klar. Vi lagrar detta färdiga tillstånd i en boolesisk variabel som heter redo
. Vi använder en annan boolesisk variabel som heter tillåten
vars värde är Sann
endast om användaren har tillåtit TTS-motorn att prata. Vi lägger också till metoder för att få och ställa in värdet av denna variabel. Vid denna punkt, Speaker.java bör ha följande innehåll:
public class Speaker implementerar OnInitListener private TextToSpeech tts; privat booleansk redo = false; privat booleansk tillåtet = false; offentlig talare (sammanhangssammanhang) tts = new TextToSpeech (context, this); offentliga booleanska isAllowed () return allowed; Offentligt ogiltigt tillåtet (Boolean tillåtet) this.allowed = Allowed;
De OnInitListener
gränssnittet har bara en metod, onInit
. Denna metod kallas när TTS-motorn har initierats. De status
parametern låter oss veta om initialiseringen lyckades. När vi väl vet att initialiseringen lyckades ställer vi in TTS-motorns språk. Detta är viktigt för att framställa tal som är begripligt. Lägg till följande kod:
@Override public void onInit (int status) if (status == TextToSpeech.SUCCESS) // Ändra detta för att matcha din // locale tts.setLanguage (Locale.US); redo = sant; annat klar = false;
Därefter lägger vi till en metod som heter tala
, som använder motorn för att läsa ut någon text som skickas till den. Innan det görs kontrollerar den om båda tillåten
och den redo
värdena är Sann
. Det tal som det genererar placeras i anmälningsströmmen.
public void speak (String text) // Tal bara om TTS är klart // och användaren har tillåtit tal om (redo && tillåtet) HashMaphash = ny HashMap (); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (text, TextToSpeech.QUEUE_ADD, hash);
Vi lägger sedan till en metod som spelar tystnad under en viss tid. Med hjälp av denna metod kan vi lägga till pauser till talet så att det låter lite tydligare. Lägg till följande kod för genomförandet:
public void pause (int duration) tts.playSilence (duration, TextToSpeech.QUEUE_ADD, null);
Slutligen lägg till en metod för att frigöra resurser när TTS-motorn inte längre behövs.
// Frigör resurser public void destroy () tts.shutdown ();
Redigera MainActivity.java och förklara alla synpunkter som vi nämnde i layouten. Förklara två heltal, LONG_DURATION
och KORT VARAKTIGHET
. Dessa är bara värden som skickas till Högtalare
's paus
metod.
Förklara också a CHECK_CODE
heltal. Det är värdet är inte viktigt. Det skickas till startActivityforResult
metod och sedan används för att identifiera resultatet.
Slutligen, förklara a Högtalare
objekt och a BroadcastReceiver
objekt.
Vid denna tidpunkt ska din klass se ut så här:
public class MainActivity utökar aktiviteten privat final int CHECK_CODE = 0x1; privat slutlig int LONG_DURATION = 5000; privat sista int SHORT_DURATION = 1200; privat högtalare högtalare; privat ToggleButton växla; privat OnCheckedChangeListener toggleListener; privat TextView smsText; privat textvisning smsSender; privat BroadcastReceiver smsReceiver;
Lägg till en metod för att kontrollera om en TTS-motor är installerad på enheten. Kontrollen utförs genom att använda resultatet av en annan Aktivitet
.
privat tomt checkTTS () Intent check = new Intent (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (kontrollera, CHECK_CODE);
När resultatet av startActivityForResult
anländer, den onActivityResult
Metoden heter. Därför måste vi åsidosätta det. I denna metod, om resultatet är positivt, initierar vi Högtalare
objekt. Om ingen TTS-motor är installerad, omdirigerar vi användaren för att installera den.
@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) om (requestCode == CHECK_CODE) if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) högtalare = ny högtalare else Intent install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (installera);
Nu är det dags att skapa vår BroadcastReceiver
att hantera de meddelanden som enheten mottar. När det finns nya meddelanden, är det onReceive
Metoden heter. Vi analyserar meddelandena, som kommer som byte arrayer, med hjälp av SmsMessage
klass. När meddelandet är analyserat använder vi metoder som getDisplayMessageBody
och getOriginatingAddress
att extrahera meningsfull information ut ur den.
Med denna information genererar vi texten som TTS-motorn ska läsa ut. Vi pausar för LONG_DURATION
innan du läser ett nytt SMS och för KORT VARAKTIGHET
mellan uttalandena av SMS-avsändarens namn och SMS: s kropp.
Lägg till följande kod för genomförandet:
private void initializeSMSReceiver () smsReceiver = ny BroadcastReceiver () @Override public void onReceive (Context context, Intent intent) Bundle bundle = intent.getExtras (); om (bunt! = null) Objekt [] pdus = (Objekt []) bundle.get ("pdus"); för (int i = 0; iVi kan bara extrahera sändarens telefonnummer från meddelandet. För att kartlägga detta nummer till en kontakt namn måste vi använda användarens kontakter. Följande metod söker efter kontaktuppgifterna. Om telefonnumret inte är tillgängligt i användarens kontakter, returnerar det bara strängen
okänt nummer
:privat sträng getContactName (String-telefon) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (phone)); Stringprojektion [] = ny sträng [] ContactsContract.Data.DISPLAY_NAME; Markörmarkör = getContentResolver (). Fråga (uri, projektion, null, null, null); om (cursor.moveToFirst ()) return cursor.getString (0); annars returnera "okänt nummer";Innan
BroadcastReceiver
kan användas, det måste registreras. I följande metod skapar vi enIntentFilter
för inkommande textmeddelanden och registrera sedan vårsmsReceiver
för det:privat tomt registerSMSReceiver () IntentFilter intentFilter = nytt IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter);Därefter skapar vi
onCreate
metod. Här är där vi initierar alla objekt vi förklarade. Vi initierartoggleListener
för att ställa in värdet påtillåten
iHögtalare
klass.Efter dessa initialiseringar kallar vi
checkTTS
,initializeSMSReceiver
, ochregisterSMSReceiver
metoder.@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); växla = (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 view, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking)); annars speaker.speak (getString (R.string.stop_speaking)); speaker.allow (false); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();Slutligen, i
onDestroy
Metod för aktiviteten, vi avregistrerar vår mottagare och stänger av TTS-motorn för att frigöra resurser.@Override protected void onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy ();7. Kör och testa
Appen är nu redo att bli testad. Kompilera och kör det på en fysisk Android-enhet. Tryck på växlingsknappen för att aktivera röst och skicka dig ett SMS från en annan telefon eller fråga en av dina vänner att göra det. Du ska snart kunna höra din telefon läsa SMS för dig.
Här är ett urval av talet som genereras av TTS-motorn:
Slutsats
I den här handledningen har du lärt dig att inte bara använda text-till-tal-API, utan också använda sändarmottagare och förnuftiga med rå SMS-data. Du kan nu fortsätta att anpassa denna app till dina behov.