Programowanie komórek z Windows Mobile - łatwiejsze niż myślisz!

Programowanie komórek z Windows Mobile - łatwiejsze niż myślisz!

11.10.2007 13:30, aktualizacja: 11.10.2007 16:20

Łatwo zauważyć, że nowe dziecko firmy Apple - iPhone - pomimo niewątpliwych braków sprzętowych, jest doskonale wyposażony, jeżeli chodzi o oprogramowanie. Spójrzmy teraz na konkurencję stosującą Windows Mobile. Wiele urządzeń z tym systemem ma zewnętrzne klawiatury QWERTY, procesory taktowane zegarami 300-400 MHz, wbudowaną obsługę sieci 3G i transferów HSDPA, a niektóre również zintegrowane moduły GPS. Tego typu sprzęty pozostawiają iPhone o lata świetlne w tyle, gdy chodzi o wyposażenie, jednak dostarczane wraz z nimi oprogramowanie należy uznać za raczej "kulawe". Na szczęście .NET dla urządzeń mobilnych czyni z "komórek" z systemem Microsoftu wygodną platformę testową nawet dla początkujących programistów.

Jako dobry przykład "użyteczności" rozumianej inaczej można podać funkcję dodawania kontaktu, która w systemie Windows Mobile przeprowadza nas przez prawie czterdzieści ( sic! ) różnych pól, a w tym tak przydatnych informacji, jak nazwisko asystenta, menadżera, numer pagera, czy też "Radio tel", cokolwiek to jest. Z drugiej strony w systemie Microsoftu brakuje naprawdę przydatnych funkcji, jak na przykład filtrowania listy kontaktów według jakichś zadanych kryteriów.

Tego rodzaju drobiazgi powodują, że używanie konkurencji - w tym urządzeń z systemami Symbiana - jest przyjemnością, podczas gdy w sprzęcie z Windows Mobile zawsze pojawia się jakieś "ale"... . Na szczęście zawsze pozostaje inna droga: własne programy. Korzystając z narzędzi Microsoftu pokażemy dziś, jak rozpocząć budowanie własnego systemu książki telefonicznej ( menedżera kontaktów ) dla telefonu z WM5. Do tego celu będzie nam potrzebne środowisko programistyczne Microsoft Visual Studio 2005 oraz biblioteka Windows Mobile SDK.

Kieszonkowy Outlook

Telefon wyposażony w system Windows Mobile użytkownik otrzymuje razem z zestawem standardowych aplikacji, takich jak Excel Mobile, PowerPoint Mobile, czy Word Mobile, z których wszystkie są "kieszonkowymi" odpowiednikami desktopowych aplikacji znanych z pakietu biurowego Microsoft Office. Gdzieś w tle działa natomiast kolejna aplikacja w swojej mobilnej wersji: Pocket Outlook. Zarządzanie kontaktami, notatkami i zadaniami jest wplecione w wiele miejsc i dlatego "mały" Outlook pełni tutaj rolę serwera danych, udostępniającego je na życzenie innych, korzystających z nich aplikacji. Jedną z nich będzie, ta, którą zaraz przygotujemy.

Aby rozpocząć tworzenie naszego programu, uruchamiamy Visual Studio i z menu wybieramy _ File | New | Project... _. Następnie rozwijamy gałąź _ Visual C# | Smart Device _, wybieramy _ Windows Mobile 5.0 Pocket PC _ i jako szablon projektu zaznaczamy _ Device Application _.

Na formę, która się pojawi, przeciągamy z przybornika ( Toolbox ) kontrolkę _ TabControl _, która jest dostępna w grupie _ Device Containers _. Ustawiamy jej właściwość _ Dock _ na wartość _ Fill _, tak aby wypełniła całą dostępną powierzchnię okna, po czym dodajemy jeszcze dwie zakładki, bądź to klikając _ Add Tab _ w panelu właściwości obiektu, bądź też wybierając tę opcję z menu kontekstowego kontrolki. Następnie wybieramy z panelu _ Properties _ właściwość _ TabPages _ naszej kontrolki, klikając mały przycisk obok tekstu _ ( Collection ) _. Pojawi się edytor kolekcji, który umożliwi na przykład nadawanie nazw naszym zakładkom. Nazwijmy je: "Wszystkie", "Ulubione" i "Klawiatura". Póki co, ostatnim etapem budowy interfejsu użytkownika będzie przeciągnięcie na zakładkę "Wszystkie" kontrolki listy ( ListBox ), znajdującej się w zasobniku, w grupie _ Common Device Controls _ i nadanie jej nazwy "lstAll".Pora na napisanie pierwszej linijki kodu, jednak wcześniej musimy jeszcze do naszego projektu dodać dwie
referencje. W panelu widoku projektu - _ Solution Explorer _ - klikamy prawym przyciskiem myszy na gałęzi _ References _ naszego projektu i z menu kontekstowego wybieramy opcję _ Add Reference... _ i na liście, która się pojawi, wskazujemy _ Microsoft.WindowsMobile.PocketOutlook _ oraz _ Microsoft.WindowsMobile.Telephony _. Teraz klikamy prawym przyciskiem myszy na elemencie _ Form1.cs _ i z menu wybieramy opcję _ View Code _. Pojawi się okienko z kodem źródłowym naszej formy i możemy przejść do zapoznawania się z kieszonkową wersją Outlooka. Najpierw do używanych przestrzeni nazw, pod ostatnią linijką ze słowem kluczowym "using" dopisujemy linijkę kodu ( 1 ), potem dodajemy do klasy zmienną statyczną "outlook" ( 2 ) i na koniec w konstruktorze, zaraz po inicjalizacji naszej formy ( _ InitializeComponent( ) _ ), dopisujemy kod ( 3 ), wypełniający naszą listę kontaktami otrzymanymi od Outlooka.

Klasa _ OutlookSession _ jest głównym interfejsem do komunikacji z programem Pocket Outlook i pobierania wszystkich udostępnianych przez niego danych, więc właściwie należy stworzyć jeden nowy obiekt tego typu, przechować go i udostępnić wszystkim modułom tworzonego programu. Dlatego też udostępniliśmy go jako publiczną zmienną statyczną w klasie _ Form1 _.

Na razie nasz program nie robi wiele. Enumeruje jedynie wszystkie kontakty w książce adresowej i dodaje je do listy. Ponieważ klasa _ Contact _ posiada przeciążoną metodę _ ToString( ) _, to dodając do naszej listy te obiekty, otrzymamy w wyniku ładnie sformatowane teksty w postaci domyślnej wyświetlanej nazwy kontaktu, jak na przykład "Kowalski, Jan".

Przed pierwszym uruchomieniem programu można jeszcze zmienić tytuł głównej formy na "Kontakty+" i usunąć z dołu pasek menu _ mainMenu1 _, którego nie będziemy wykorzystywali.

Dodajemy nasze kontakty

Prostą rzeczą jest obejrzenie listy nazw kontaktów, lecz, jak już wspomnieliśmy, Windows Mobile pozwala na przechowanie prawie czterdziestu różnych informacji o pojedynczej osobie - jak teraz w prosty sposób dostać się do interesującej nas pozycji? W Visual Studio wystarczy po identyfikatorze zmiennej wpisać znak ".", a środowisko zaraz podpowie nam wszystkie dostępne metody i zmienne klasy _ Contact _. Jak widać jest tego bardzo dużo, mamy tu na przykład odpowiednią właściwość dla każdej porcji informacji o kontakcie, a także zdarzenia, _ Changed _ dla każdej z nich, które są wywoływane w chwili, kiedy poszczególne dane kontaktu zostaną gdzieś zmienione.Wróćmy teraz do projektowania naszej formy. Zmieniamy właściwość _ Dock _ listy na wartość _ Top _, rozciągamy ją tak, aby zostało pod nią trochę miejsca i przeciągamy tam z przybornika kontrolkę _ Panel _ ( grupa _ Device Containers _ ), po czym ustawiamy jego właściwość _ Dock _ na wartość _ Fill _. Następnie na tym panelu umieszczamy przycisk. Windows CE
Forms ( mobilna wersja Windows Forms ) nie pozwala umieszczać pasków narzędziowych, ani menu wewnątrz kontenerów takich jak na przykład _ TabControl _, czy _ Panel _ i dlatego jesteśmy zmuszeni do wykorzystywania zwyczajnych przycisków. Nowemu przyciskowi zmieniamy tekst na "Dodaj" i pozycjonujemy go wedle upodobania na panelu.

Teraz pora na dodanie drugiej formy. Klikamy prawym przyciskiem na gałęzi naszego projektu w panelu _ Solution Explorer _ i wybieramy z menu kontekstowego opcję _ Add | New Item _, po czym wybieramy _ Windows Form _ i zatwierdzamy przyciskiem _ Add _. Nowa forma będzie używana do wprowadzania podstawowych danych nowo tworzonego kontaktu, więc umieśćmy na niej dwie etykiety ( _ Label _ ), ustawiając ich teksty na "Nazwa" i "Numer" oraz dwa pola do wprowadzania tekstu ( _ TextBox _ ). Po odpowiednim ich ustawieniu należy jeszcze dodać dwie pozycje do menu formy na dole. Jedną z nich będzie "Zapisz", a drugą "Anuluj".

Przejdźmy teraz do kodu i obsłużmy zdarzenia po wybraniu obu tych pozycji menu. Wciśnięcie "Anuluj" powoduje jedynie zamknięcie okienka, czyli wywołanie metody _ Close( ) _, lecz wybranie "Zapisz" musi skutkować zapisaniem nowego kontaktu do książki adresowej Outlooka.

Może brzmi to skomplikowanie, lecz jest w istocie bardzo proste, gdyż klasa _ Contact _ udostępnia nam wszystkie potrzebne do tego właściwości, a samo dodanie kontaktu to jedynie wywołanie metody _ Contacts.Items.Add( ) _ na obiekcie typu _ OutlookSession _, który mamy przechowany w naszej pierwszej formie. Dodamy jeszcze tylko prostą walidacje wprowadzonych danych i gotowe - sprawdzimy tylko, czy użytkownik wprowadził nazwę dodawanego kontaktu.

Ponieważ w formie _ Form2 _ używamy klasy _ Contact _, to do wykorzystywanych przestrzeni nazw musimy również dodać _ using Microsoft.WindowsMobile.PocketOutlook; _. Teraz pozostało nam jedynie wywołanie drugiej formy po wciśnięciu przycisku "Dodaj" na pierwszej. Powracamy więc do projektowania _ Form1 _ i klikamy dwukrotnie na rzeczonym przycisku, co umożliwi nam obsłużenie zdarzenia _ Click _. Wpisujemy tam poniższy kod:

Możemy wreszcie uruchomić nasz program. Wszystko powinno działać bez problemu, możemy spróbować dodać nowy kontakt, jednak natrafimy tutaj na problem - nasza lista się nie odświeża. Powodem tego jest fakt, że listę tę wypełniamy tylko w konstruktorze pierwszej formy, kiedy jest ona tworzona i jest to robione tylko raz. Należy więc operację tę powtórzyć po dodaniu nowego kontaktu, dlatego też przeniesiemy naszą pętlę wypełniającą listę z konstruktora do nowej metody _ ReadContacts( ) _

Teraz możemy wywołać tę metodę w dowolnym momencie, kiedy tylko chcemy odświeżyć listę kontaktów, jak na przykład na starcie, w konstruktorze, czy też po linii _ addContact.ShowDialog( ) _.

Czas na rozmowę

Kiedy możemy już dodawać nowe kontakty do książki adresowej, zobaczmy jak możemy wykonywać połączenia. Wydawać by się mogło, że będzie to najtrudniejsza część naszego zadania, lecz dzięki gotowej bibliotece _ Microsoft Telephony API _ to pestka. Nie jest może ona zbyt obszerna i pozwala jedynie na proste wykonywanie połączeń oraz wysyłanie krótkich wiadomości tekstowych SMS, nie udostępniając bardziej zaawansowanych funkcji, jak na przykład rejestry rozmów, lecz na potrzeby naszego programu to na razie wystarczy. Dodatkowe funkcje zawsze można oprogramować samemu.

To, co potrzebujemy teraz zrobić, to wykonać połączenie, kiedy z listy zostanie wybrana jakaś osoba.

Powróćmy więc do projektowania głównej formy naszej aplikacji, zaznaczmy listę _ lstAll _ i w edytorze właściwości ( _ Properties _ ) wybieramy widok zdarzeń ( _ Events _ ) i kliknijmy dwukrotnie na polu _ SelectedValueChanged _. Środowisko stworzy szkielet metody do obsługi zdarzenia, a nam pozostanie wypełnić ją treścią.

Napisany przez nas fragment najpierw sprawdza, czy w istocie element listy został zaznaczony ( użytkownik mógł go również "odznaczyć" ), potem zamienia element listy na obiekt typu _ Contact _ w celu wyłuskania z niego numeru telefonicznego, po czym wykonuje faktyczne połączenie. Aby to zrobić, wystarczy stworzyć inny obiekt typu _ Phone _ i wywołać jego metodę _ Talk( ) _ podając jako parametr żądany numer telefonu. Warto zauważyć, że parametr ten jest literałem i można go podać w postaci alfanumerycznej, jak często podaje się numery telefonów w Stanach Zjednoczonych - na przykład 1-800-MY-APPLE.Aby nasz kod zadziałał, musimy jeszcze do używanych przestrzeni nazw dodać jedną linijkę: _ using Microsoft.WindowsMobile.Telephony; _. Wspomnieliśmy już wcześniej także o możliwości wysyłania SMS-ów. Jest to równie proste, co wykonywanie połączeń. Wystarczy lekko zmodyfikować nasz poprzedni kod i już mamy nową funkcjonalność

Ponieważ rozmowy i wysyłanie krótkich wiadomości tekstowych SMS są funkcjami dostępnymi tylko w fizycznych urządzeniach i nie działają w emulatorze, to aby przetestować pełne działanie naszej aplikacji, musimy zainstalować ją w telefonie i dopiero wtedy będzie można sprawdzić, czy nasz kod działa poprawnie. Cała pozostała funkcjonalność może być jednak bez żadnych problemów testowana w emulatorze, jednak kiedy wywołamy funkcję połączenia, czy wysłania widomości, skończy się to błędem.

Zadanie domoweTo, co udało nam się zrobić, jest dopiero szkieletem menedżera kontaktów, lecz zapoznaliśmy się z podstawowymi narzędziami i funkcjami, które pozwolą na dalszy jej rozwój i implementację innych, ciekawych funkcji. Dodaliśmy już zakładki "Ulubione" i "Klawiatura", które wystarczy jedynie wypełnić treścią i oprogramować, co nie powinno przysporzyć specjalnych problemów. Oto lista przykładowych funkcji, o które możemy wzbogacić naszą aplikację:

- zmiana funkcjonalności głównej formy tak, aby wybranie kontaktu z listy umożliwiało także edycję jego danych przy pomocy istniejącej już formy _ Form2 _;
- dodanie menu kontekstowego do listy kontaktów, przy pomocy którego użytkownik miałby łatwy dostęp do różnych funkcji, czy to wykonania połączenia, czy też na przykład wysłania wiadomości SMS;
- stworzenie prostej formy zawierającej pole tekstowe do przygotowania treści wysyłanej wiadomości, bo wysyłanie jedynie tekstu "Cześć!" nie jest specjalnie przydatne;
- implementacja wirtualnej klawiatury poprzez umieszczenie na odpowiedniej zakładce przycisków umożliwiających wpisanie z ręki numeru telefonu. Zaawansowani użytkownicy mogą równiej udostępnić tutaj możliwość dodania wybranego numeru do listy kontaktów;
- podział wpisywanej nazwy kontaktu na imię i nazwisko z wykorzystaniem funkcji _ Split( ) _ klasy _ string _. Informacje te można potem zapisać w oddzielnych polach obiektu _ Contact _: _ FirstName _ i _ LastName _;

Możemy teraz do woli bawić się i testować naszą aplikację. Pamiętajmy, że Visual Studio pozwala na debugowanie programów działających na fizycznych urządzeniach, więc mamy możliwość ustawiania pułapek i "podglądania" programu pracującego na telefonie, oczywiście pod warunkiem, że jest on w tym czasie połączony z komputerem. Pamiętajmy tylko, że każde, nawet testowe, wykonanie połączenia, czy wysłanie wiadomości tekstowej kosztuje i nieskończona pętla wysyłająca SMS-y może zrujnować nasz domowy budżet.
Gotowy kod projektu jest dołączony do artykułu, można go pobrać i rozpocząć zabawę. Zaimplementowane są tam oba warianty obsługi zdarzenia _ SelectedValueChanged _ i wystarczy odpowiednio ustawić komentarz aby wysyłać wiadomości, lub też wykonywać połączenia.

Na tym kończymy wstęp do programowania naszego telefonu, który miał pokazać, jak łatwe jest w istocie zbudowanie działającej aplikacji, wykonującej, wydawać by się mogło, skomplikowane funkcje. Popatrzmy, że cały nasz kod zawiera zaledwie około 70 linijek ( i to wliczając w to komentarze )! Jeżeli od dziś nie spojrzysz już nigdy na swój telefon w ten sam sposób co kiedyś, to cel tego wprowadzenia został osiągnięty. Powodzenia!

_ Tekst stanowi tłumaczenie artykułu Paula Hudsona "Program your phone" opublikowanego w brytyjskim czasopiśmie PC Plus 10/2007 _

Źródło artykułu:PC World Komputer
Oceń jakość naszego artykułuTwoja opinia pozwala nam tworzyć lepsze treści.
Wybrane dla Ciebie
Komentarze (0)