Strona 1 Interfejsy API telefonii Wysyłanie wiadomości SMS Odbieranie wiadomości SMS Symulowanie nadchodzących wiadomości SMS Obsługa skrzynki wiadomości SMS Wysyłanie wiadomości e-mail Monitorowanie połączeń telefonicznych
Strona 2 Interfejsy API telefonii Klasy Android SDK umożliwiają programową obsługę krótkich wiadomości tekstowych SMS (Short Messaging Service) oraz obsługę funkcji telefonu. Przeznaczone są do tego klasy określane jako tzw. menadżery: android.telephony.smsmanager menadżer SMS, android.telephony.telephonymanager menadżer telefonii.
Strona 3 Wysyłanie wiadomości SMS (metoda 1) Pierwsza, w pełni programowa metoda wysyłania wiadomości tekstowych, polega na wykorzystaniu interfejsów API telefonii, a konkretnie klasy android.telephony.smsmanager. String nr_telefonu; String wiadomosc; intencja wywoływana po wysłaniu wiadomości intencja wywoływana po dostarczeniu powiadomienia SmsManager smsmgr = SmsManager.getDefault(); smsmgr.sendtextmessage(nr_telefonu, null, wiadomosc, null, null); adresat (numer telefonu) numer centrum SMS (null to domyślne) tekst wiadomości obiekty klasy PendingIntent obiekty klasy String Wysyłanie wiadomości tekstowych SMS wymaga nadania dla aplikacji odpowiedniego uprawnienia: Wymagane uprawnienie android.permission.send_sms
Strona 4 Wysyłanie wiadomości SMS (metoda 2) Druga metoda wysyłania wiadomości tekstowych polega na wywołaniu predefiniowanej intencji, która uruchamia systemową aplikację do wysyłania wiadomości SMS. Jako rodzaj akcji należy podać Intent.ACTION_VIEW, natomiast dane dla intencji to treść wiadomości i jej typ MIME. Wadą tego rozwiązania jest konieczność wprowadzania numeru telefonu w aplikacji systemowej. String msg; Intent intencja = new Intent(Intent.ACTION_VIEW); intencja.putextra( sms_body, msg); nazwa akcji (działania) związanego z intencją dane dla intencji intencja.settype( vnd.android-dir/mms-sms ); // typ MIME danych startactivity(intencja); Nie jest wymagane uprawnienie android.permission.send_sms (posiada je aktywność systemowa)
Strona 5 Wiadomości SMS w emulatorze W przypadku uruchamiania aplikacji wysyłających wiadomości SMS w emulatorze systemu Android, możliwe jest wysyłanie wiadomości pomiędzy dwoma uruchomionymi emulatorami. Numerem telefonu jest zawsze numer portu emulatora, widoczny w lewymgórnym rogu belki okna emulatora. Potwierdzeniem wysłania wiadomości jest brak wygenerowania wyjątku przez metodę sendtextmessage() i odebranie wiadomości w aplikacji systemowej w drugim oknie emulatora. Do obsługi wiadomości tekstowych w emulatorze służy systemowa aplikacja SMS/MMS (Messaging).
Strona 6 Obsługa wiadomości SMS w emulatorze numer telefonu to numer portu komputera na którym działa emulator numer telefonu nadawcy Systemowa aplikacja SMS/MMS Aplikacja wysyłająca Emulator odbierający Emulator odbierający
Strona 7 Monitorowanie przychodzących wiadomości SMS Najprostszy sposób nasłuchiwania przychodzących wiadomości SMS to utworzenie klasy dziedziczącej po android.content.broadcastreceiver. public class NaszMonitorSMS extends BroadcastReceiver private static final String AKCJA= android.provider.telephony.sms_received ; @Override public void onreceive(context c, Intent intencja) if (intencja!= null && intencja.getaction()!= null && AKCJA.compareToIgnoreCase(intencja.getAction()) == 0) Object[] tab = (Object[]) intencja.getextras().get( pdus ); SmsMessage[] msg = new SmsMessage[tab.length]; for (int i = 0; i < tab.length; i++) msg[i] = SmsMessage.createFromPdu( (byte[]) tab[i]); tablica obiektów PDU (Protocol Description Unit), reprezentujących wiadomości SMS metoda abstrakcyjna wywoływana automatycznie po nadejściu wiadomości SMS intencja przekazuje obiekt SmsMessage konwersja obiektów PDU na obiekty SmsMessage
Strona 8 Rejestracja i uprawnienia monitora wiadomości SMS Monitor nasłuchu utworzony na str. 69 należy zarejestrować w pliku manifestu aplikacji AndroidManifest.xml, w węźle receiver. Odbieranie wiadomości tekstowych SMS wymaga nadania dla aplikacji odpowiedniego uprawnienia: Wymagane uprawnienie android.permission.receive_sms W efekcie fragment pliku AndroidManifest.xml może być następujący: <application... rejestrowanie monitora nasłuchu SMS <receiver android:name="naszmonitorsms" > <intent-filter > <action android:name="android.provider.telephony.sms_received"/> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.receive_sms" />...
Strona 9 Symulacja nadejścia wiadomości SMS w emulatorze W środowisku Eclipse możliwa jest symulacja nadchodzących wiadomości tekstowych SMS. Należy w tym celu przejść do widoku Emulator Control wybierając w głównym menu polecenia Window Show View Other Android Emulator Control. W oknie, które się pojawi (patrz str. 72), w sekcji okna Telephony actions należy: wypełnić pole Incoming number (numer telefonu), zaznaczyć pole wyboru SMS, wypełnić pole Message tekstem wiadomości, kliknąć przycisk Send. W przypadku symulacji przychodzącego połączenia telefonicznego zaznaczamy pole Voice i nie wypełniamy pola Message.
Strona 10 Okno środowiska Eclipse do symulacji nadejścia wiadomości tekstowej SMS
Strona 11 Obsługa skrzynki wiadomości tekstowych SMS Interfejsy API telefonii umożliwiają kwerendę zawartości skrzynki odbiorczej. Przykładowy plik XML interfejsu użytkow. /res/layout/sms_inbox.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="fill_content" /> </LinearLayout> Dostęp do skrzynki odbiorczej wiadomości tekstowych SMS i odczyt wiadomości wymagają nadania dla aplikacji odpowiedniego uprawnienia: Wymagane uprawnienie android.permission.read_sms kontrolka TextView wyświetla treść wiadomości SMS jako pojedynczy element listy (tworzenie listy patrz str. 74)
Strona 12 Obsługa skrzynki wiadomości tekstowych SMS (c.d.) Lista elementów każdy z nich zawiera część treści wiadomości SMS. public class SMSInboxDemo extends ListActivity private ListAdapter adapter; identyfikator URI wskazuje skrzynkę odbiorczą wiadomości SMS private static final Uri SMS_INBOX = Uri.parse( content://sms/inbox ); @Override public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); Cursor c = getcontentresolver().query(sms_inbox,null,null,null,null); startmanagingcursor(c); String[] kolumny = new String[] body ; int[] nazwy = new int[] R.id.tv ; adapter = kwerenda przy użyciu obiektu kursora adapter dla listy klasy ListActivity new SimpleCursorAdapter(this,R.layout.sms_inbox,c,kolumny,nazwy); setlistadapter(adapter);
Strona 13 Identyfikatory URI skrzynek wiadomości tekstowych SMS Dostęp do pozostałych folderów w skrzynce wiadomości tekstowych SMS można uzyskać podając odpowiedni identyfikator URI folderu jako argument metody getcontentresolver. folder wiadomości tekstowych SMS Wszystkie Odebrane Wysłane Wersje robocze Nieodebrane Niewysłane Zakolejkowane Niedostarczone Konwersacje identyfikator URI folderu content://sms/all content://sms/inbox content://sms/sent content://sms/draft content://sms/outbox content://sms/failed content://sms/queued content://sms/undelivered content://sms/conversations W analogiczny sposób można uzyskać dostęp do wiadomości MMS, np. content://mms-sms/inbox
Strona 14 Wysyłanie wiadomości e-mail Android nie zwiera interfejsów API do wysyłania wiadomości e-mail. Jedyna możliwość to uruchomienie systemowej aplikacji do obsługi poczty elektronicznej, np. za pomocą intencji o akcji ACTION_SEND. Intent intencja = new Intent(Intent.ACTION_SEND); String[] adresat = new String[] adresat@serwer.pl ; String temat = Temat wiadomości ; String tresc = To jest treść wiadomości. ; intencja.putextra(intent.extra_mail, adresat); intencja.putextra(intent.extra_subject, temat); intencja.putextra(intent.extra_text, tresc); // do wiadomości (carbon copy): // intencja.putextra(intent.extra_cc, /* adresat kopii */); // ukryte do wiadomości (blind carbon copy): // intencja.putextra(intent.extra_bcc, /* ukryty adresat kopii */); intencja.settype( message/rfc822 ); // typ MIME danych startactivity(intencja);
Strona 15 Informacja o stanie telefonu Do obsługi funkcji telefonu służy tzw. menadżer telefonii, czyli klasa android.telephony.telephonymanager. Umożliwia ona uzyskanie informacji o usługach telefonicznych dostępnych w urządzeniu oraz o zmianach stanu połączenia telefonicznego. Obsługa funkcji telefonicznych powoduje w momencie nadejścia połączenia telefonicznego przejście działających aplikacji w stan wstrzymania (pauza) i kontynuowanie ich działania po zakończeniu połączenia telefonicznego. Uzyskanie dostępu do informacji o stanie telefonu wymaga nadania dla aplikacji odpowiedniego uprawnienia: Wymagane uprawnienie android.permission.read_phone_state W środowisku Eclipse możliwa jest symulacja nadchodzących połączeń telefonicznych (patrz str. 78) w podobny sposób jak w przypadku wiadomości tekstowych SMS.
Strona 16 Okno środowiska Eclipse do symulacji nadejścia połączenia telefonicznego
Strona 17 Monitorowanie przychodzących połączeń telefonicznych W celu monitorowania przychodzących połączeń telefonicznych należy utworzyć klasę dziedziczącą po PhoneStateListener i jej obiekt przekazać do metody listen. public class TelefoniaDemo extends Activity @Override public void oncreate(bundle savedinstancestate) //... super.oncreate(savedinstancestate); TelephonyManager tm = (TelephonyManager) getsystemservice(context.telephony_service); tm.listen(new NaszPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE); pobranie obiektu menadżera telefonii metoda listen i implementacja klasy PhoneStateListener nasłuchuje zmian stanu telefonu
Strona 18 Monitorowanie przychodzących połączeń telefonicznych (c.d.) //... class NaszPhoneStateListener extends PhoneStateListener @Override stan telefonu public void oncallstatechanged(int state, String incomingnumber) super.oncallstatechanged(state, incomingnumber); switch (state) // sprawdzenie stanu telefonu case TelephonyManager.CALL_STATE_IDLE: // stan bezczynności break; case TelephonyManager.CALL_STATE_RINGING: // poł.przychodz. break; case TelephonyManager.CALL_STATE_OFFHOOK: // poł. odebrane break; default: break; klasa wewnętrzna numer telefonu połączenia przychodzącego Metoda wywoływana automatycznie w momencie wykrycia połączenia przychodzącego lub zmiany stanu telefonu. Dostępny jest stan telefonu i numer telefonu połączenia przychodzącego. Przydatna uwaga: numer telefonu urządzenia mobilnego zwracany jest przez metodę getline1number() z klasy TelephonyManager.