J2ME Praktyczne projekty Wydanie II j2mep2


J2ME. Praktyczne
Idz do
projekty. Wydanie II
" Spis treści
" Przykładowy rozdział
Autor: Krzysztof Rychlicki-Kicior
ISBN: 978-83-246-2835-3
Format: 158×235, stron: 272
Katalog książek
" Katalog online
" Zamów drukowany
katalog
Naucz się efektywnie wykorzystywać możliwości oferowane przez J2ME!
Twój koszyk " Zainstaluj najnowszą wersję środowiska Java ME SDK
" Poznaj zasady tworzenia aplikacji mobilnych
" Rozwiń swoje umiejętności w oparciu o praktyczne projekty z wykorzystaniem J2ME
" Dodaj do koszyka
J2ME, czyli Java 2 Micro Edition, to uproszczona wersja platformy Java, opracowana przez firmÄ™ Sun
Microsystems specjalnie dla potrzeb programowania urządzeń przenośnych, takich jak telefony
Cennik i informacje
komórkowe czy palmtopy. Umożliwia tworzenie ciekawych i wydajnych aplikacji mobilnych, które
bez większych problemów można uruchamiać na sprzęcie o stosunkowo słabych parametrach
technicznych. Pozwala to osobom zainteresowanym produkcją gier, programów multimedialnych
" Zamów informacje
czy narzędzi sieciowych swobodnie rozwinąć skrzydła w tej dziedzinie.
o nowościach
 J2ME. Praktyczne projekty. Wydanie II to przydatny przewodnik po zaawansowanych
" Zamów cennik
zagadnieniach, związanych z tworzeniem różnego rodzaju aplikacji mobilnych przy użyciu
środowiska Java. Autor pokrótce przedstawia w nim podstawowe informacje na temat
Czytelnia
projektowania i kodowania programów działających na urządzeniach przenośnych, aby szybko
przejść do konkretnych przykładów zastosowania zdobytej wiedzy. Dzięki nim nauczysz się
tworzyć gry, aplikacje komunikacyjne, programy multimedialne i narzędzia GPS. Jeśli chcesz
" Fragmenty książek
szybko opanować J2ME, tej książki nie może zabraknąć na Twojej półce!
online
" Instalacja środowiska programisty J2ME
" Podstawowe informacje o platformie i sposobach jej używania
" Obsługa zaawansowanych wyświetlaczy
" Tworzenie aplikacji sieciowych i komunikacyjnych
" Przetwarzanie i wykorzystywanie danych XML
" Tworzenie aplikacji multimedialnych i obsługa kamer
" Projektowanie i programowanie gier
" Tworzenie aplikacji GPS
Dołącz do elitarnego grona programistów aplikacji mobilnych!
Kontakt
Helion SA
ul. Kościuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
© Helion 1991 2011
Spis tre ci
Wst p .............................................................................................. 7
Rozdzia 1. Warsztat dla MIDletów ..................................................................... 9
Instalacja oprogramowania ............................................................................................... 9
Tworzenie nowego projektu ........................................................................................... 10
Publikowanie MIDletu ............................................................................................. 11
Kod MIDletu .................................................................................................................. 12
Interfejs u ytkownika ..................................................................................................... 14
MID Profile a kompatybilno MIDletu ................................................................... 14
Polecenia .................................................................................................................. 15
Podstawowe komponenty graficzne ......................................................................... 16
Przyk adowy projekt ....................................................................................................... 19
Rozdzia 2. Podstawy aplikacji mobilnych ......................................................... 23
Przegl d klas wy wietlaczy ............................................................................................ 23
Canvas ...................................................................................................................... 23
Alert ......................................................................................................................... 26
List ........................................................................................................................... 26
Projekt  program graficzny ......................................................................................... 27
Rozdzia 3. Zaawansowane rodzaje wy wietlaczy .............................................. 35
Obs uga RMS w Javie .................................................................................................... 35
Zapis w RMS .................................................................................................................. 37
Tablice bajtów a odczyt danych ...................................................................................... 38
Usuwanie a zbiory .......................................................................................................... 39
Zaawansowane techniki przegl dania zbiorów ............................................................... 39
Projekt  program Notatki ............................................................................................ 40
Interfejs programu .................................................................................................... 41
Pakiet pl.helion.j2mepp.notatki ................................................................................ 41
Wy wietlenie listy notatek ....................................................................................... 43
Obs uga polece ....................................................................................................... 44
Przechowywanie danych i nie tylko ......................................................................... 45
Zarz dzanie notatkami ............................................................................................. 49
Testowanie aplikacji ....................................................................................................... 52
Rozdzia 4. Internet w MIDletach ..................................................................... 53
Projekt  czat na komórk ............................................................................................ 53
Sie  z czym to si je? .......................................................................................... 54
Jak zawsze  interfejs ............................................................................................. 54
4 J2ME. Praktyczne projekty
Obs uga aplikacji ...................................................................................................... 56
Czas na internet! ....................................................................................................... 58
Obs uga po czenia w aplikacji ................................................................................ 61
Serwer czata ............................................................................................................. 66
Wysy anie wiadomo ci ............................................................................................. 70
Obs uga po cze klienckich .................................................................................... 71
Podsumowanie projektu ................................................................................................. 76
Rozdzia 5. Obs uga XML w J2ME ..................................................................... 77
Projekt  czytnik RSS ................................................................................................... 77
J2ME a XML ............................................................................................................ 78
Wykorzystanie biblioteki kXML w MIDletach ........................................................ 79
Dzia anie programu i jego interfejs .......................................................................... 79
J zyk RSS ................................................................................................................ 82
Struktura Dane ......................................................................................................... 84
Obs uga polece w MIDlecie ................................................................................... 86
Pobieranie dokumentu RSS ...................................................................................... 88
Pi kne jak gra na SAXofonie  biblioteka kXML pod lup ................................... 89
Parser w praktyce ..................................................................................................... 91
Podsumowanie ................................................................................................................ 97
Rozdzia 6. Multimedia w Twoim telefonie ........................................................ 99
Projekt  odtwarzacz multimedialny ............................................................................ 99
Obs uga multimediów w telefonach ....................................................................... 100
Proces odtwarzania pliku ........................................................................................ 100
ród a plików multimedialnych ............................................................................. 101
Interfejs programu .................................................................................................. 102
Odtwarzacz a FileConnection Optional Package .................................................... 108
Implementacja przegl darki systemu plików w projekcie ...................................... 111
Obs uga multimediów w odtwarzaczu .................................................................... 115
Nagrywanie d wi ku .............................................................................................. 119
Odtwarzanie nagrania ............................................................................................. 121
Obs uga aparatu ...................................................................................................... 122
Przerywanie odtwarzania i zamykanie odtwarzacza ............................................... 123
Wykorzystanie RMS w projekcie ........................................................................... 125
Podsumowanie ....................................................................................................... 129
Rozdzia 7. Zagrajmy! .................................................................................... 131
Projekt  gra  platformówka ..................................................................................... 131
Struktura klas ......................................................................................................... 131
Game API ............................................................................................................... 132
Ma y MIDlet ........................................................................................................... 134
P ócienna gra .......................................................................................................... 134
Warstwy i duszki .................................................................................................... 137
G ówna p tla gry .................................................................................................... 139
Wykorzystanie zalet p ótna .................................................................................... 140
Duszki w grze ......................................................................................................... 144
Bohater w akcji ...................................................................................................... 150
Od bohatera do potworka ....................................................................................... 154
Globalna obs uga potworków ................................................................................. 158
Strzelanie ................................................................................................................ 160
Zarz dzanie pociskami ........................................................................................... 162
Dane a logika .......................................................................................................... 165
Grafika w grze ........................................................................................................ 170
Podsumowanie .............................................................................................................. 171
Spis tre ci 5
Rozdzia 8. J2ME a Bluetooth ........................................................................ 173
Projekt  us uga szyfruj ca ......................................................................................... 173
MIDlet .................................................................................................................... 174
Zasady dzia ania ..................................................................................................... 176
Znalaz em, wys a em, odebra em! .......................................................................... 183
Kod klienta ............................................................................................................. 185
Podsumowanie .............................................................................................................. 190
Rozdzia 9. Ma y szpieg  zdalna kamera ...................................................... 191
Za o enia projektowe ................................................................................................... 192
Nadawca ................................................................................................................. 192
Odbiorca ................................................................................................................. 193
Serwer .................................................................................................................... 194
Konfigurujemy serwer .................................................................................................. 194
Widok  interfejs aplikacji klienckiej ................................................................... 196
Kontroler  obs uga zdarze i sterowanie aplikacj ............................................. 200
Timer i zadania ....................................................................................................... 202
Danie g ówne  HTTP bez trzymanki .................................................................. 205
Serwer w akcji .............................................................................................................. 210
SID  klucz jedyny w swoim rodzaju ................................................................... 213
Serwer i jego metody .............................................................................................. 216
Podsumowanie .............................................................................................................. 217
Rozdzia 10. Lokalizator ................................................................................... 219
Wprowadzenie .............................................................................................................. 219
Funkcjonalno projektu ........................................................................................ 219
Interfejs u ytkownika ................................................................................................... 220
Zagl damy pod mask & ........................................................................................ 229
Instalacja i konfiguracja bazy danych ..................................................................... 234
Przenosiny na serwer .............................................................................................. 235
Mened er bezpiecze stwa ...................................................................................... 242
Obs uga bazy danych w aplikacji serwerowej ........................................................ 244
Spajanie w ca o ................................................................................................... 247
Podsumowanie .............................................................................................................. 249
Dodatek A ................................................................................... 251
Projekt  edytor plansz ............................................................................................... 251
Podsumowanie .............................................................................................................. 254
Skorowidz .................................................................................... 255
Rozdzia 6.
Multimedia
w Twoim telefonie
Telefony komórkowe coraz cz ciej zawieraj dodatkowe udogodnienia, dzi ki którym
przestaj by tylko urz dzeniami do prowadzenia rozmów. Jednym z najpopularniej-
szych sposobów przyci gania uwagi klientów jest dodawanie mo liwo ci multimedial-
nych, takich jak:
odtwarzanie plików d wi kowych (midi/wav/mp3),
odtwarzanie plików wideo (mpeg),
nagrywanie audio,
wykonywanie zdj ,
nagrywanie plików wideo.
J2ME umo liwia programistom wykorzystanie tych mo liwo ci, o ile dany telefon obs u-
guje sprz towo dan funkcj .
Projekt  odtwarzacz multimedialny
Jak sama nazwa wskazuje, w niniejszym projekcie zostan zaprezentowane wybrane
mo liwo ci multimedialne, które oferuje J2ME. Równie wa n cech programu b dzie
obs uga wielu rodzajów róde danych  odtwarzacz b dzie móg wczytywa dane
z internetu (za pomoc protoko u HTTP), z lokalnego systemu plików (za pomoc
klas z pakietu javax.microedition.io.file) oraz z RMS. Oprócz odtwarzania zasobów
multimedialnych program umo liwi nagranie d wi ku i zrobienie zdj cia  z mo li-
wo ci zapisu w RMS.
Na pocz tku warto dowiedzie si , gdzie s zadeklarowane klasy obs uguj ce multimedia
i jakie warunki musi spe nia urz dzenie, aby dany rodzaj multimediów odtworzy .
100 J2ME. Praktyczne projekty
Obs uga multimediów w telefonach
Najbardziej funkcjonalnym API (w momencie pisania tej ksi ki  ca y czas s two-
rzone jego kolejne wersje) jest Mobile Media API 1.1, zdefiniowane w JSR-135. Zawiera
ono klasy i interfejsy przeznaczone do wykonywania wszystkich wspomnianych na
pocz tku rozdzia u czynno ci. Jak to zwykle bywa, API to nie jest powszechnie dos-
t pne w telefonach komórkowych. Dlatego najbardziej podstawowe elementy zawarte
w MMAPI zosta y wydzielone i wesz y w sk ad MIDP 2.0. Owa cz nosi nazw
MIDP 2.0 Media API i jedynym warunkiem, który musi spe nia telefon, aby mo liwe
by a jego wykorzystanie, jest dost pno MIDP w wersji 2.0.
Za obs ug multimediów odpowiadaj pakiety javax.microedition.media, javax.
microedition.media.control oraz javax.microedition.media.protocol. Zawarto
tych pakietów mo na podzieli na trzy cz ci:
elementy dost pu do danych  na podstawie URL udost pniaj strumienie
danych;
odtwarzacze  kontroluj proces przygotowania i odtwarzania (a tak e
nagrywania) danych multimedialnych;
kontrolki  odpowiadaj za konkretn w a ciwo odtwarzacza, np. g o no
lub wysoko d wi ku.
Ró nice mi dzy MMAPI a MIDP Media API
Jak wspomnia em, MIDP Media API jest podzbiorem MMAPI. Poni sze zestawienie
zawiera zbiór wszystkich elementów dost pnych w MIDP Media API:
klasy: Manager;
klasy wyj tków: MediaException;
interfejsy: Control, Controllable, Player, PlayerListener, ToneControl,
VolumeControl.
MMAPI zawiera wszystkie powy sze elementy oraz szereg innych. Spora cz z nich
zostanie wykorzystana w projekcie.
Proces odtwarzania plikulnych
W niniejszym podrozdziale opisz wszystkie czynno ci, które trzeba wykona , aby
odtworzy plik multimedialny. Program zazwyczaj dysponuje adresem internetowym lub
cie k dost pu do pliku. Na pocz tek nale y wi c zapozna si z metod createPlayer()
klasy Manager. Tworzy ona obiekt odtwarzacza (klasy Player) na podstawie podanego
adresu lub strumienia:
Player odtwarzacz = Manager.createPlayer("http://serwer.org/plik.wav");
Rozdzia 6. Multimedia w Twoim telefonie 101
Dysponuj c gotowym obiektem odtwarzacza, nale y wspomnie o stanach, w jakich
mo e si on znajdowa . S one okre lone nast puj cymi sta ymi (w kolejno ci od stanu
pocz tkowego do odtwarzania):
UNREALIZED  odtwarzacz jest tu po utworzeniu. Nie mo na wykona
wi kszo ci jego metod.
REALIZED  odtwarzacz ma informacje potrzebne do pobrania danych.
PREFETCHED  odtwarzacz dysponuje pobranymi danymi; jest gotowy
do rozpocz cia odtwarzania.
STARTED  odtwarzacz jest w trakcie odtwarzania pliku multimedialnego.
W przypadku przerwania odtwarzania przechodzi z powrotem do stanu
PREFETCHED.
CLOSED  odtwarzacz ko czy dzia anie i zwalnia zaalokowane zasoby.
Aby przej do danego stanu, nale y wywo a metody: realize(), prefetch(), start(),
close(). Metoda stop() przerywa dzia anie odtwarzacza i powoduje przej cie do stanu
PREFETCHED.
javax.microedition.media.Manager
public Player createPlayer(String url)  tworzy obiekt odtwarzacza
na podstawie adresu danego zasobu.
public Player createPlayer(InputStream is, String typ)  tworzy obiekt
odtwarzacza na podstawie danego strumienia wej cia i okre lonego typu MIME.
ród a plików multimedialnych
MMAPI 1.1 daje olbrzymie mo liwo ci co do wyboru róde , z których mo na pobiera
dane multimedialne. Najwa niejsz rol odgrywa URL, przekazywany w parametrze
metody createPlayer(). Adres, jak ka dy inny, sk ada si z trzech cz ci. Jednak w przy-
padku lokalizatorów multimediów mo e on przyj posta daleko inn od tej znanej
z codziennego u ytkowania komputera.
Podstawowym typem jest odtwarzanie plików pobranych za pomoc protoko u HTTP.
URL przyjmuje wtedy posta :
http://www.serwer.org/folder/plik.wav
gdzie http:// to okre lenie protoko u, www.serwer.org  nazwa hosta (komputera,
z którym program musi si po czy ), a /folder/plik.wav  cie ka do pliku na
serwerze. Ta posta jest znana; zupe nie inaczej wygl da jednak konstruowanie adresów
w przypadku przechwytywania danych audio i wideo.
Aby utworzy obiekt klasy Player, który umo liwi rejestrowanie jakichkolwiek danych,
nale y zastosowa protokó capture://. Nast pnie nale y poda rodzaj przechwyty-
wanego materia u  audio lub video. Na tym nie koniec  po znaku zapytania mo na
okre li jego parametry techniczne, np. rate (cz stotliwo próbkowania w przypadku
d wi ku) lub width i height (rozmiary obrazu w przypadku wideo).
102 J2ME. Praktyczne projekty
Oczywi cie przechwytywanie materia u audio i wideo wymaga zastosowania dodatko-
wych kontrolek; s to odpowiednio: RecordControl i VideoControl. Omówi je w jed-
nym z nast pnych podrozdzia ów, w momencie gdy zostan zastosowane w naszym
projekcie.
Interfejs programu
Aby zrozumie , dlaczego stosujemy taki, a nie inny sposób tworzenia interfejsu, trzeba
najpierw omówi dzia anie programu. Po uruchomieniu programu u ytkownik musi
wybra rodzaj ród a danych: internet, system plików lub RMS. Pozosta e dwie mo li-
wo ci to przechwytywanie  audio lub wideo. W przypadku pobierania pliku z internetu
sytuacja jest najprostsza  nale y udost pni u ytkownikowi pole do wprowadzenia
adresu. Zdecydowanie bardziej skomplikowane jest wykorzystanie systemu plików.
Nasz MIDlet udost pnia bowiem minimenad er plików, który umo liwia swobodne
poruszanie si po strukturze katalogów. W przypadku zbioru rekordów program wy wie-
tla list wszystkich zarejestrowanych multimediów. Bez wzgl du na sposób pobierania
u ytkownik dociera do formatki, która jest wy wietlana przy odtwarzaniu plików.
OdtwarzaczMIDlet.java
private Odtwarzacz odtwarzacz;
private MenadzerPlikow menadzer;
private List menu;
private List listaFile;
private List listaRms;
private Form formaHttp;
private Form formaAparat;
private Form formaOdtwarzacz;
private List listaPrzechwytujaca;
private Display ekran;
private TextField poleUrl;
private final String[] POLECENIA_PRZECHWYTYWANIA = new String[]
{"Start","Stop","Odtworz","Zapisz"};
private final String[] OPCJE = new String[]
{"Odtworz plik z Internetu","Odtworz plik z urzadzenia","Odtworz plik z
RMS","Przechwyc audio", "Zrob zdjecie"};
}
Lista zmiennych ujawnia cz ciowo zawarto projektu. Na pocz tku s zadeklarowane
dwa kluczowe obiekty: odtwarzacz i menadzer. Pierwszy z nich odpowiada za wszelkie
kwestie zwi zane z wykorzystaniem sk adników pakietu javax.microedition.media,
a drugi  za obs ug systemu plików.
Nie powinna dziwi du a liczba list u ytych w tym projekcie. Wi kszo wy wietlaczy
musi da u ytkownikowi mo liwo wyboru  do tego najlepiej nadaj si w a nie
listy. Dwie z nich maj sta e elementy  s zadeklarowane w powy szym listingu.
Pozosta e dwie wczytuj swoj zawarto z systemu plików i RMS.
Wi ksz cz konstruktora MIDletu zajmuj instrukcje tworz ce obiekty wy wietlaczy
i zaopatruj ce je w polecenia. Pojawia si przy tym ciekawa konstrukcja:
Rozdzia 6. Multimedia w Twoim telefonie 103
OdtwarzaczMIDlet.java
package pl.helion.j2mepp.odtwarzacz;
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class OdtwarzaczMIDlet extends MIDlet implements CommandListener
{
public OdtwarzaczMIDlet() throws Exception
{
menu = new List("Wybierz akcje:",Choice.IMPLICIT,OPCJE,null);
Command wybierz = new Command("Wybierz",Command.OK,0);
Command koniec = new Command("Koniec",Command.EXIT,0);
Command powrot = new Command("Powrot",Command.EXIT,0);
menu.addCommand(koniec);
menu.addCommand(wybierz);
menu.setSelectCommand(wybierz);
menu.setCommandListener(this);
formaHttp = new Form("Podaj adres URL:");
poleUrl = new TextField("","http://",150,TextField.ANY);
formaHttp.append(poleUrl);
Command ok = new Command("OK",Command.OK,0);
formaHttp.addCommand(ok);
formaHttp.addCommand(powrot);
formaHttp.setCommandListener(this);
listaFile = new List("Wybierz plik:",List.IMPLICIT);
Command wejdz = new Command("Wejdz",Command.ITEM,0);
Command wyjdz = new Command("Wyjdz",Command.ITEM,1);
listaFile.addCommand(wejdz);
listaFile.addCommand(wyjdz);
listaFile.addCommand(powrot);
listaFile.setSelectCommand(wejdz);
listaFile.setCommandListener(this);
listaPrzechwytujaca = new List("Przechwyc
audio",Choice.IMPLICIT,POLECENIA_PRZECHWYTYWANIA,null);
listaPrzechwytujaca.addCommand(powrot);
listaPrzechwytujaca.addCommand(wybierz);
listaPrzechwytujaca.setSelectCommand(wybierz);
listaPrzechwytujaca.setCommandListener(this);
listaRms = new List("Wybierz element:",Choice.IMPLICIT);
listaRms.addCommand(wybierz);
listaRms.addCommand(powrot);
listaRms.setSelectCommand(wybierz);
listaRms.setCommandListener(this);
formaOdtwarzacz = new Form("Teraz odtwarzane...");
formaOdtwarzacz.append("");
formaOdtwarzacz.addCommand(powrot);
formaOdtwarzacz.setCommandListener(this);
formaAparat = new Form("Zrob zdjecie");
formaAparat.append("");
Command pstryk = new Command("Pstryk!",Command.OK,0);
formaAparat.addCommand(powrot);
formaAparat.addCommand(pstryk);
formaAparat.setCommandListener(this);
odtwarzacz = new Odtwarzacz(this);
menadzer = new MenadzerPlikow(this);
104 J2ME. Praktyczne projekty
ekran = Display.getDisplay(this);
ekran.setCurrent(menu);
}
W powy szym kodzie znajduj si dwie ciekawe, zastosowane po raz pierwszy kon-
strukcje. Polecenie o nazwie Wybierz pojawia si w aplikacji wiele razy. Nie ma sensu
tworzy takiego samego obiektu pod ró nymi nazwami  jedna instancja klasy Command
mo e by dodana do ró nych formularzy, o ile przy identyfikowaniu polecenia korzysta
si z jego typu i priorytetu. Mimo e metoda setSelectCommand() jednocze nie dodaje
polecenie (o ile nie zosta o wcze niej jawnie dodane), to obiekt wybierz jest dodawany
r cznie w kodzie MIDletu, aby lepiej zobrazowa liczb zastosowanych do ka dej for-
matki polece .
Drugim intryguj cym mechanizmem jest dodanie do formatek formaOdtwarzacz i forma
Aparat pustych etykiet tekstowych. Tak naprawd rodzaj dodanego komponentu nie
ma znaczenia  wywo anie tego wariantu metody append() jest po prostu najkrótsze.
Wa ne jest, aby formatka mia a jeden komponent. W trakcie dzia ania aplikacji owa pusta
etykieta tekstowa zostanie zast piona np. kontrolk wy wietlaj c film.
Przed omówieniem najd u szej metody zajm si krótkimi metodami pomocniczymi,
wykorzystywanymi przez pozosta e klasy pakietu do dzia a na interfejsie MIDletu:
OdtwarzaczMIDlet.java
public void startApp() {}
public void pauseApp() {}
public void destroyApp(boolean u)
{
odtwarzacz.koniec();
}
public void wyswietlElementy(String[] wartosci)
{
listaFile.deleteAll();
for (int i=wartosci.length-1;i>=0;i--)
listaFile.append(wartosci[i],null);
}
public void wlaczWyswietlacz(Item it)
{
if (it!=null)
formaOdtwarzacz.set(0,it);
else
formaOdtwarzacz.set(0,new StringItem("",""));
ekran.setCurrent(formaOdtwarzacz);
}
W momencie zako czenia aplikacji odtwarzacz musi zwolni wszystkie swoje zasoby.
Dwie pozosta e metody przypominaj te znane z poprzednich projektów. W metodzie
wyswietlElementy() dodajemy nowe elementy od ko ca tablicy, tak aby ostatni element
z tablicy znalaz si na górze wy wietlanej listy. Druga z metod pe ni kluczow rol
przy odtwarzaniu filmów. Obiekt it zawiera obszar, w którym jest wy wietlany film.
Musi on zatem zosta wy wietlony na formatce. Przy odtwarzaniu d wi ków film nie
jest jednak potrzebny, dlatego stosuj pust etykiet tekstow .
Rozdzia 6. Multimedia w Twoim telefonie 105
Metoda obs ugi zdarze w tym projekcie jest rozbudowana. Wynika to z du ej liczby
zawartych w aplikacji wy wietlaczy i dost pnych polece . Jej opis jest podzielony na
kilka cz ci:
OdtwarzaczMIDlet.java
public void commandAction(Command c, Displayable s)
{
if (s == menu)
{
if (c.getCommandType() == Command.OK)
{
if (menu.getSelectedIndex() == 0)
ekran.setCurrent(formaHttp);
if (menu.getSelectedIndex() == 1)
{
menadzer.odswiez();
menadzer.wyswietlKorzenie();
ekran.setCurrent(listaFile);
}
if (menu.getSelectedIndex() == 2)
{
listaRms.deleteAll();
String[] numery = odtwarzacz.pobierzID();
for (int i=0;i listaRms.append(numery[i],null);
ekran.setCurrent(listaRms);
}
if (menu.getSelectedIndex() == 3)
ekran.setCurrent(listaPrzechwytujaca);
if (menu.getSelectedIndex() == 4)
{
ekran.setCurrent(formaAparat);
Item it = odtwarzacz.pobierajObraz();
if (it!=null)
formaAparat.set(0,it);
}
}
if (c.getCommandType() == Command.EXIT)
{
this.destroyApp(true);
this.notifyDestroyed();
}
}
W metodzie tej mo na znale wiele odwo a do obiektów menadzer i odtwarzacz.
Istot obs ugi zdarze listy-menu jest wy wietlanie innych formatek. Niektóre z nich
wymagaj jednak wcze niejszego przygotowania. Tak jest w przypadku listy lista
Plikow, która wy wietla list katalogów i plików. Przed pierwszym wy wietleniem
program musi pobra list korzeni systemu plików (ang. root)  szerzej zostanie to
omówione nieco dalej. Nie inaczej jest, gdy pobieramy spis nagra z RMS. Po uprzed-
nim wyczyszczeniu listy i pobraniu identyfikatorów nast puje wy wietlenie elementów.
Wreszcie formatka formaAparat otrzymuje obiekt wy wietlaj cy obraz z kamery tele-
fonu i ustawia go jako komponent  teraz widoczne jest zastosowanie jednej z pustych
etykiet tekstowych. Obs uga zdarze kolejnych wy wietlaczy jest zró nicowana:
106 J2ME. Praktyczne projekty
OdtwarzaczMIDlet.java
if (s == formaHttp)
{
if (c.getCommandType() == Command.OK)
if (!poleUrl.getString().equals(""))
{
odtwarzacz.przygotuj(poleUrl.getString());
}
if (c.getCommandType() == Command.EXIT)
ekran.setCurrent(menu);
}
if (s == listaFile)
{
if (c.getCommandType() == Command.ITEM)
{
try
{
if (c.getPriority()==0)
{
int k = listaFile.getSelectedIndex();
if (k>-1)
{
menadzer.przejdzDo(listaFile.getString(k));
if (menadzer.jestKatalog())
{
String[] wyniki = menadzer.zwrocZawartosc();
this.wyswietlElementy(wyniki);
} else
{
odtwarzacz.przygotuj(menadzer.pobierzSciezke());
}
}
}
if (c.getPriority()==1)
{
menadzer.wyjdzDoGory();
String[] wyniki = menadzer.zwrocZawartosc();
this.wyswietlElementy(wyniki);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (c.getCommandType() == Command.EXIT)
{
ekran.setCurrent(menu);
}
}
Obs uga formatki wczytuj cej plik z internetu jest banalna  wszystkim zajmuje si
metoda przygotuj(). Zdecydowanie bardziej z o ona jest konstrukcja obs uguj ca sys-
tem plików. Polecenia s tylko dwa: Wejdz (priorytet 0) i Wyjdz (priorytet 1). Pierw-
sze z nich jest gotowe zarówno na sytuacj , w której zaznaczony obiekt jest folderem,
jak i plikiem. Metoda zwrocZawartosc() pobiera list katalogów i plików aktualnego
Rozdzia 6. Multimedia w Twoim telefonie 107
katalogu, okre lonego za pomoc metody przejdzDo(). Je li mamy do czynienia z pli-
kiem, wtedy próbujemy go odtworzy . Rozszerzenie tego modu u, aby sprawdza zawar-
to plików przed prób odtworzenia, czytelnik mo e potraktowa jako wiczenie roz-
szerzaj ce funkcjonalno programu. Prostsz czynno ci jest przej cie do katalogu
wy szego rz du.
OdtwarzaczMIDlet.java
if (s == listaRms)
{
if (c.getCommandType() == Command.OK)
if (listaRms.getSelectedIndex()>-1)
odtwarzacz.przygotuj(" rms://"+listaRms.getString
(listaRms.getSelectedIndex()));
if (c.getCommandType() == Command.EXIT)
ekran.setCurrent(menu);
}
if (s == formaOdtwarzacz)
{
if (c.getCommandType() == Command.EXIT)
{
ekran.setCurrent(menu);
odtwarzacz.przerwij();
}
}
if (s == formaAparat)
{
if (c.getCommandType() == Command.OK)
{
try
{
odtwarzacz.pobierzZdjecie();
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (c.getCommandType() == Command.EXIT)
{
ekran.setCurrent(menu);
odtwarzacz.przerwij();
}
}
Nast pna lista, przechowuj ca spis nagranych multimediów, korzysta w adresie z pro-
toko u o nazwie "rmsp", utworzonego na potrzeby tej aplikacji. W rzeczywisto ci chodzi
o sprecyzowanie jednego systemu przekazywania danych do metody przygotuj().
Obiekt mened era pobiera identyfikator rekordu, który znajduje si za definicj proto-
ko u, a nast pnie na jego podstawie wczytuje w a ciwy rekord. Forma formaOdtwarzacz
musi zadba o przerwanie odtwarzania w chwili, gdy u ytkownik wybierze polecenie
Wyjdz. Utworzenie zdj cia za pomoc formatki formaAparat wymaga wywo ania tylko
jednej metody  wszystkie szczegó y implementacyjne s zawarte w klasach Odtwarzacz
i CzytnikDanych.
108 J2ME. Praktyczne projekty
OdtwarzaczMIDlet.java
if (s == listaPrzechwytujaca)
{
if (c.getCommandType() == Command.OK)
{
if (listaPrzechwytujaca.getSelectedIndex() == 0)
odtwarzacz.przechwyc(true);
if (listaPrzechwytujaca.getSelectedIndex() == 1)
odtwarzacz.przechwyc(false);
if (listaPrzechwytujaca.getSelectedIndex() == 2)
odtwarzacz.odtworzNagranie();
if (listaPrzechwytujaca.getSelectedIndex() == 3)
try
{
odtwarzacz.zapisz("audio/x-wav");
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (c.getCommandType() == Command.EXIT)
{
odtwarzacz.przechwyc(false);
ekran.setCurrent(menu);
}
}
}
Ostatnia z list udost pnia spor palet czynno ci. Metoda przechwyc() rozpoczyna lub
zatrzymuje nagrywanie, zgodnie z warto ci przekazanego parametru. Warto zwróci
uwag na metod zapisz() z klasy Odtwarzacz. Operacja zapisu wymaga podania typu
MIME, jaki ma by okre lony dla nagrania. Na jego podstawie mo na wywnioskowa ,
w jaki sposób multimedia stworzone przez u ytkownika s przechowywane w RMS. Otó
ka dy rekord sk ada si z dwóch cz ci: zawarto ci oraz nazwy typu MIME. Dzi ki
temu mo na przechowywa ró nego rodzaju zawarto , która dzi ki zapami tanemu
typowi MIME mo e by prawid owo rozpoznana przez odtwarzacz.
W trakcie testowania nie nale y martwi si obrazem, który znajduje si na ekranie
emulatora  w prawdziwym urz dzeniu w tym miejscu znajdowa by si aktualny obraz
kamery.
Odtwarzacz a FileConnection Optional Package
Zanim omówi multimedialny aspekt naszej aplikacji, postaram si przybli y funkcjo-
nowanie systemu plików w telefonach komórkowych. Nast pnie opisz klas Menadzer
Plikow, która w naszym MIDlecie odpowiada za przegl danie struktury katalogów
i wybór plików do odtwarzania.
Rozdzia 6. Multimedia w Twoim telefonie 109
Prawie jak PC
API definiuj ce wykonywanie operacji na plikach jest zawarte w JSR-75. Pakiet odpo-
wiedzialny za obs ug plików to javax.microedition.io.file. Zawiera on pi elemen-
tów, jednak z punktu widzenia naszej aplikacji najwa niejsze s dwa:
interfejs FileConnection umo liwiaj cy otwieranie plików, przegl danie
zawarto ci katalogów i inne podstawowe operacje,
klasa FileSystemRegistry, która m.in. udost pnia list korzeni systemu plików
urz dzenia.
Dwa razy w tym rozdziale pojawi o si s owo  korze  . Jak sama nazwa wskazuje, jest
on czym podstawowym; mo na porówna go do partycji systemu Windows (np. c:, d:).
Korzenie mog wskazywa na foldery znajduj ce si w pami ci telefonu, ale mog te
dotyczy np. udost pnionych kart pami ci1.
Obecno powy szych elementów JSR-75 w pakiecie javax.microedition.io.file
oraz charakterystyczna nazwa interfejsu pozwalaj przypuszcza , e proces korzystania
z systemu plików jest podobny do nawi zywania po czenia z internetem. Tak faktycz-
nie jest; jedyn ró nic , poza stosowanym interfejsem, jest sk adnia adresu, za pomoc
którego s lokalizowane pliki i katalogi. Przyk adowy adres wygl da tak:
file:///root1/filmy/film.mpg
Pierwsze sze znaków, czyli file://, stanowi okre lenie protoko u. Nast pnie widzimy
nazw korzenia (/root1) oraz cie k do pliku wraz z jego nazw (/filmy/film.mpg).
Nawi za po czenie z danym plikiem lub katalogiem mo na nawet wtedy, gdy on
nie istnieje. Mo na go wtedy utworzy za pomoc metody create() lub mkdir(). Je li
jednak wczytywany zasób istnieje, sprawa jest prosta. W przypadku pliku wystarczy
odwo a si do wiedzy z rozdzia u 4. i wywo a metod openInputStream(). Troch
bardziej skomplikowanie wygl da sytuacja, gdy mamy do czynienia z katalogami. Mo na
wywo a wtedy metod list(), która zwraca list wszystkich katalogów i plików
w okre lonej lokalizacji.
Jednak co powinni my zrobi , gdy chcemy wczyta nowy plik lub sprawdzi zawarto
innego katalogu? Chocia w interfejsie FileConnection jest zadeklarowana metoda
setFileConnection(), to jest ona obwarowana licznymi zastrze eniami (m.in. element
aktualnie wskazywany musi by katalogiem, a nowy element musi istnie w tym kata-
logu). Dlatego zaleca si tworzenie nowego obiektu interfejsu FileConnection przy
dost pie do ka dego kolejnego elementu.
FileConnection Optional Package a uprawnienia dost pu
Nie ka de urz dzenie zezwala na pe ny zakres operacji w odniesieniu do udost pnianych
plików i katalogów. Tradycyjnie zakres danych uprawnie okre la si w metodzie
open() klasy Connector. Sta e definiuj ce sposób dost pu s identyczne jak w przypadku
1
Na przyk ad w telefonach wykorzystuj cych system Nokia OS pami wewn trzna jest widziana jako C:,
a dodatkowa karta pami ci jako E:.
110 J2ME. Praktyczne projekty
po cze internetowych. W przypadku niemo no ci uzyskania danego trybu dost pu
do pliku lub katalogu aplikacja zwraca wyj tek klasy SecurityException.
Tryb dost pu ma wp yw na mo liwo wykonania metod klasy FileConnection. Dlatego
nale y uwa a , czy w trybie tylko do odczytu (READ_ONLY) nasza aplikacja nie wywo uje
metody openOutputStream()  taka operacja, jakkolwiek zostanie dopuszczona przez
kompilator, na pewno spowoduje wyj tek SecurityException.
Nie nale y uruchamia dwóch instancji tego samego emulatora wykorzystuj cych
FCOP API, poniewa mo e doj do b dów w wykonywaniu operacji odczytu i zapisu.
Opis mo liwo ci FCOP
Metody udost pniane przez klas i interfejs znajduj si w poni szym zestawieniu.
javax.microedition.io.file.FileSystemRegistry
public static Enumeration listRoots()  zwraca wszystkie dost pne
w urz dzeniu korzenie. Nazwy s przechowywane w postaci a cuchów
w obiekcie wyliczeniowym.
javax.microedition.io.file.FileConnection
public long availableSize()  zwraca ilo dost pnego miejsca w korzeniu,
w którym znajduje si plik lub katalog okre lony danym obiektem po czenia.
public void create()  tworzy plik o cie ce okre lonej w danym obiekcie
po czenia.
public void delete()  usuwa plik o cie ce okre lonej w danym obiekcie
po czenia.
public boolean exists()  sprawdza, czy plik lub katalog okre lony w danym
obiekcie po czenia istnieje.
public boolean isDirectory()  sprawdza, czy obiekt okre lony w po czeniu
jest katalogiem.
public Enumeration list(String klucz, boolean czyUkryte)  zwraca
wszystkie pliki i katalogi znajduj ce si w katalogu okre lonym w danym
obiekcie po czenia. Wszystkie elementy s filtrowane wed ug klucza (mo na
zastosowa znak *, oznaczaj cy dowolny ci g znaków); je li parametr czyUkryte
ma warto true, metoda zwraca tak e pliki i katalogi ukryte.
Je li emulator nie zwraca poprawnej zawarto ci katalogu, nale y skasowa plik in.use
z katalogu /appdb/.
public void mkdir()  tworzy katalog o cie ce okre lonej w danym obiekcie
po czenia.
Rozdzia 6. Multimedia w Twoim telefonie 111
public InputStream openInputStream()  zwraca strumie wej cia (do odczytu)
dla okre lonego pliku.
public OutputStream openOutputStream()  zwraca strumie wyj cia
(do zapisu) dla okre lonego pliku.
public void setFileConnection(String nazwa)  tworzy w danym obiekcie
po czenie z nowym plikiem lub katalogiem i zast puje nim aktualne.
public void truncate(long n)  usuwa wszystkie dane z pliku okre lonego
w po czeniu, pocz wszy od n-tego bajtu.
Implementacja przegl darki systemu plików
w projekcie
Podsumujmy wnioski, które mo na wyci gn z analizy MIDletu, a zw aszcza metody
commandAction(), dotycz ce wykorzystania w odtwarzaczu systemu plików:
Program ma mo liwo pobrania listy korzeni.
Program mo e porusza si po strukturze katalogów w obydwie strony (w g b
i do góry).
Program mo e pobra plik i udost pni go obiektowi odtwarzacza.
Wszystkie metody potrzebne do wykonania powy szych czynno ci s zawarte w klasie
MenadzerPlikow.
Lista zmiennych klasy jest wyj tkowo krótka:
MenadzerPlikow.java
private FileConnection plik;
private OdtwarzaczMIDlet m;
private String sciezka = "/";
private static final String PRZED = "file://";
}
Znaczenia zmiennej plik dla dzia ania klasy nie trzeba chyba t umaczy . Zmienna
sciezka w po czeniu ze sta PRZEDROSTEK tworzy pe n cie k dost pu do pliku
i katalogu. Obiekt MIDletu jest potrzebny do wywo ania metod od wie aj cych list ,
która przedstawia zawarto aktualnego katalogu (listaPlikow).
Konstruktor zawiera bardziej interesuj c konstrukcj . Stosowane jest w nim sprawdze-
nie, czy urz dzenie oferuje dost p do File API:
MenadzerPlikow.java
package pl.helion.j2mepp.odtwarzacz;
import javax.microedition.io.file.*;
import javax.microedition.io.*;
import java.util.*;
112 J2ME. Praktyczne projekty
import java.io.*;
public class MenadzerPlikow
{
public MenadzerPlikow(OdtwarzaczMIDlet _m) throws Exception
{
m = _m;
String v = System.getProperty("microedition.io.file.FileConnection.version");
if (v==null)
throw new Exception("Brak obslugi systemu plikow!");
}
Metoda getProperty() klasy System s u y do pobierania w a ciwo ci maszyny wirtu-
alnej i zwraca null, je li w a ciwo o podanej nazwie nie istnieje. Je li tak si stanie
w naszym przypadku, zostanie wygenerowany wyj tek. Pierwsza z metod to metoda
wyswietlKorzenie():
MenadzerPlikow.java
public void wyswietlKorzenie()
{
new Thread(new Runnable(){
public void run()
{
Enumeration zestaw = FileSystemRegistry.listRoots();
String[] rooty = przerobEnumerationNaString(zestaw);
m.wyswietlElementy(rooty);
}
}).start();
}
W powy szej metodzie po raz pierwszy zosta a zastosowana konstrukcja tworz ca i uru-
chamiaj ca nowy w tek w taki sposób. Korzystamy z jednego z konstruktorów klasy
Thread:
public Thread(Runnable watek)
oraz z faktu, e Java umo liwia utworzenie anonimowego obiektu interfejsu, o ile zostan
zadeklarowane wszystkie jego metody. W naszej sytuacji wystarczy utworzy metod
run(). Dlaczego jednak tworzymy dla tej czynno ci nowy w tek?
Wykonanie niektórych czynno ci, zw aszcza zwi zanych z wykorzystaniem zewn trz-
nych zasobów, wymaga zezwolenia. Uzyskuje si je na dwa sposoby:
przez cyfrowe podpisanie MIDletu; wymaga to jednak uzyskania certyfikatu
autentyczno ci z którego z dozwolonych centrów autentykacji  jest to proces
stosunkowo d ugi i drogi, zw aszcza w Polsce;
przez wy wietlenie komunikatu i bezpo redni zgod u ytkownika.
Je li u ytkownik zezwoli na dan czynno , aplikacja wykonuje kolejne instrukcje;
w przeciwnym razie zg aszany jest wyj tek klasy SecurityException. Niestety, emula-
tor oraz niektóre modele telefonów na pytanie o dost p reaguj zawieszeniem programu,
gdy pytanie pojawia si w metodzie obs ugi polece . W zwi zku z tym wszystkie
metody, które mog spowodowa wy wietlenie komunikatu, powinny by wywo ywane
w nowych w tkach.
Rozdzia 6. Multimedia w Twoim telefonie 113
Pro ba o pozwolenie jest wy wietlana zazwyczaj tylko za pierwszym razem  pó niej
program pami ta decyzj u ytkownika. W zwi zku z tym nie trzeba zabezpiecza wszyst-
kich metod. W klasie MenadzerPlikow wiadomo, e to metoda wyswietlKorzenie() zawsze
jako pierwsza prosi o dost p, tak wi c tylko ona musi by uruchamiana w nowym w tku.
Metoda ta wykorzystuje metod listRoots() klasy FileSystemRegistry. Przy u yciu
pomocniczej metody przerobEnumerationNaString() program uzyskuje tablic a cu-
chów z obiektu wyliczeniowego. Dysponuj c tablic nazw korzeni, mo na wy wietli
je za pomoc metody wyswietlElementy().
Metoda przerobEnumerationNaString() wykorzystuje wektor:
MenadzerPlikow.java
public String[] przerobEnumerationNaString(Enumeration e)
{
Vector lista = new Vector();
while (e.hasMoreElements())
lista.addElement(e.nextElement());
String[] wyniki = new String[lista.size()];
for (int i=0;i wyniki[i] = (String)lista.elementAt(i);
return wyniki;
}
Na pocz tku przekszta camy obiekt wyliczeniowy na wektor, aby nast pnie zamieni go
na tablic a cuchów. Dlaczego wykorzystujemy dodatkowy wektor do utworzenia
tablicy? Niestety, klasa Enumeration nie ma metody zwracaj cej liczb obiektów znaj-
duj cych si w danym obiekcie wyliczeniowym. Nie znaj c tej liczby, nie mo na utwo-
rzy tablicy. Z kolei klasa Vector tak metod ma (size()).
Nast pne metody wykorzystywane w klasie MIDletu odpowiadaj za poruszanie si po
strukturze katalogów. S to metody przejdzDo() i wyjdzDoGory():
MenadzerPlikow.java
public void przejdzDo(String nazwa) throws Exception
{
sciezka += nazwa;
this.ustalPlik();
}
public void wyjdzDoGory() throws Exception
{
if (sciezka.length()>1)
{
if (this.jestKatalog())
{
sciezka = sciezka.substring(0,sciezka.length()-1);
int indeks = sciezka.lastIndexOf('/');
sciezka = sciezka.substring(0,indeks+1);
} else
{
int indeks = sciezka.lastIndexOf('/');
sciezka = sciezka.substring(0,indeks+1);
}
114 J2ME. Praktyczne projekty
if (sciezka.length()>1)
this.ustalPlik();
}
}
Metoda wchodz ca w g b struktury katalogów jest uniwersalna. Dzi ki temu sk ada
si tylko z dwóch linijek kodu. Po zmianie bie cej cie ki wywo ywana jest metoda
ustalPlik(). To w a nie ona tworzy nowy obiekt po czenia z plikiem lub katalogiem.
Druga z metod zawiera jedynie operacje na a cuchach. cie ki do katalogu i pliku
ró ni si jednym, ale wa nym detalem: pierwsza z nich zawiera na ko cu znak /
(uko nik). W przypadku katalogu w pierwszej instrukcji pozbywamy si w a nie tego
ko cowego uko nika. Nast pnie znajdujemy ostatni uko nik i usuwamy wszystko, co
si za nim znajduje (czyli nazw katalogu, z którego chcemy wyj ). W przypadku pliku
sposób post powania jest podobny, z wyj tkiem usuwania ko cowego uko nika.
Kluczow metod tej klasy jest metoda ustalPlik(). Nawi zuje ona po czenie z plikiem
i sprawdza, czy plik istnieje. Je li nie  zwraca wyj tek:
MenadzerPlikow.java
private void ustalPlik() throws IOException
{
if (plik!=null)
plik.close();
plik = (FileConnection)Connector.open(this.pobierzSciezke(),Connector.READ);
if (!plik.exists())
throw new IOException("Brak pliku!");
}
Parametr przekazany metodzie open() jest pobierany za pomoc pomocniczej metody,
wprowadzonej, aby budowanie pe nego adresu odbywa o si w jednym miejscu w kodzie.
Metoda zwrocZawartosc() to ostatnia wa na i funkcjonalna metoda w tej klasie:
MenadzerPlikow.java
public String[] zwrocZawartosc() throws IOException
{
if (sciezka.length()==1)
return this.przerobEnumerationNaString(FileSystemRegistry.listRoots());
this.ustalPlik();
if (plik.isDirectory())
{
Enumeration list = plik.list();
String[] wyniki = this.przerobEnumerationNaString(list);
return wyniki;
} else
return null;
}
Je li program chce zwróci list elementów pocz tkowego katalogu (który zawiera
zbiór korzeni), trzeba wywo a metod listRoots(). W przeciwnym wypadku metoda
ustala obecn cie k . Nast pnie, w przypadku gdy bie ca cie ka prowadzi do kata-
logu, zwracana jest lista jego elementów. W przeciwnym razie zwracana jest warto null.
Rozdzia 6. Multimedia w Twoim telefonie 115
Ostatnie trzy metody maj charakter pomocniczy. Ich tre mo na wydedukowa na
podstawie wcze niejszych metod i FCOP API:
MenadzerPlikow.java
public String pobierzSciezke()
{
return PRZED+sciezka;
}
public void odswiez()
{
sciezka = "/";
}
public boolean jestKatalog()
{
if (plik!=null)
return plik.isDirectory();
else
return false;
}
Metoda pobierzSciezke() czy dwie kluczowe cz ci adresu: protokó i w a ciw
cie k . Metoda odswiez() ma za zadanie przywróci domy ln warto cie ki (przy
powtórnym przegl daniu zawarto ci systemu plików). Ostatnia metoda sprawdza, czy
plik istnieje, i dopiero wtedy zwraca warto metody isDirectory(). W przeciwnym
wypadku zwraca warto false.
Obs uga multimediów w odtwarzaczu
Nieuchronnie zbli amy si do momentu, gdy omówi najwi ksz klas , z jak dot d si
spotkali my. Klasa Odtwarzacz, bo o niej mowa, zawiera wszystkie funkcje zwi zane
z pakietem javax.microedition.media. Proces obs ugi danych zosta wydzielony do klasy
CzytnikDanych.
Na wst pie bardzo wa na informacja: nasz odtwarzacz nie implementuje wielu kon-
trolek, które s zwi zane z procesem odtwarzanialnych. Moim celem w tym projekcie
by o zaprezentowanie istoty odtwarzania tre ci multimedialnych  obs uga poszcze-
gólnych kontrolek jest prosta i sprowadza si w du ej mierze do zapoznania si z ich
metodami.
Zaczn , jak zwykle, od listy zmiennych  równie do obszernej i zró nicowanej:
Odtwarzacz.java
private Player p;
private OdtwarzaczMIDlet m;
private VideoControl vc;
private VideoControl aparat;
private RecordControl rc;
private ByteArrayOutputStream baos;
private String sciezka;
private CzytnikDanych czytnik;
private byte[] bufor = new byte[0];
116 J2ME. Praktyczne projekty
private boolean tryb;
private boolean nagrywa = false;
private String typZdjecia;
}
Obiekt p jest najcz ciej wykorzystywany w ca ej klasie  to on pe ni rol odtwarzacza.
Zastanawia mog a dwie kontrolki wideo: vc i aparat. Jest to spowodowane koniecz-
no ci u ycia osobnych obiektów do odtwarzania i przechwytywania obrazu z aparatu.
Znaczenie pozosta ych zmiennych b d przybli a przy omawianiu konkretnych metod.
Nale y zwróci uwag na obiekt klasy CzytnikDanych, gdy to w a nie w nim b dzie
zawarty proces wczytywania danych. Po raz pierwszy stosujemy go ju w konstruktorze:
Odtwarzacz.java
package pl.helion.j2mepp.odtwarzacz;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.io.*;
import javax.microedition.lcdui.*;
public class Odtwarzacz
{
public Odtwarzacz(OdtwarzaczMIDlet p_m)
{
m = p_m;
czytnik = new CzytnikDanych(p_m);
typZdjecia = this.pobierzDomyslnyTyp();
}
Obiekt czytnika równie wymaga odwo ania do klasy MIDletu  ze wzgl du na
konieczno zamkni cia aplikacji w przypadku b du pobierania danych  ale to
omówi szczegó owo w swoim czasie. Zmienna typZdjecia przechowuje identyfikator
formatu, w jakim zapisywane b d zdj cia z aparatu. Pomocnicza metoda pobierzDo
myslnyTyp() wykorzystuje w a ciwo maszyny wirtualnej o nazwie video.snapshot.
encodings:
Odtwarzacz.java
public String pobierzDomyslnyTyp()
{
String typy = System.getProperty("video.snapshot.encodings");
if (typy.indexOf("jpeg")>-1)
return "encoding=jpeg";
if (typy.indexOf("png")>-1)
return "encoding=png";
if (typy.indexOf("gif")>-1)
return "encoding=gif";
return null;
}
Ponownie wykorzystujemy metod System.getProperty(). a cuch typy przybiera
nast puj c posta :
Rozdzia 6. Multimedia w Twoim telefonie 117
encoding=jpeg encoding=png
Analogicznie, parametr okre laj cy typ zdj cia dla wykonuj cej je metody musi mie
format encoding=xxx, gdzie xxx to nazwa typu. Jak wida , w a ciwo video.snap
shot.encodings zawiera szereg poprawnie okre lonych kodowa ; trzeba tylko wy-
bra typ. Priorytety wybieranych formatów zale od kolejno ci instrukcji if w metodzie.
Mimo e emulator obs uguje dwa typy zdj , instrukcja sprawdzaj ca typ jpeg wyst -
puje jako pierwsza i to w a nie przy u yciu typu JPEG zdj cie zostanie zapisane.
Najcz ciej pojawiaj c si w kodzie MIDletu metod jest przygotuj(). Pobiera ona
za pomoc obiektu czytnik dane wymagane przez odtwarzacz, a nast pnie rozpoczyna
proces odtwarzania:
Odtwarzacz.java
public void przygotuj(String p_sciezka)
{
sciezka = p_sciezka;
new Thread(new Runnable(){
public void run()
{
try
{
p = czytnik.analizuj(sciezka);
if (p!=null)
{
p.realize();
if (p.getContentType().equals("video/mpeg"))
tryb = true;
else
tryb = false;
odtwarzaj();
} else
if (jestObrazek(czytnik.getTyp()))
{
Image obraz = Image.createImage(czytnik.getStrumien());
ImageItem it = new ImageItem("",obraz,ImageItem.LAYOUT_CENTER,"");
m.wlaczWyswietlacz(it);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}).start();
}
Na pocz tku musimy przygotowa obiekt odtwarzacza, czym zajmuje si specjalna
metoda klasy Odtwarzacz. Je li obiekt odtwarzacza nie obs uguje danego medium,
zwracana jest warto null i mo emy sprawdzi , czy dane ród o nie okre la obrazka.
Je li tak  pobieramy jego strumie i mo emy wy wietli go za pomoc komponentu
ImageItem. Je li za odtwarzacz napotka na  klasyczny plik multimedialny, nale y
okre li rodzaj medium  audio lub wideo  i przyst pi do odtwarzania.
118 J2ME. Praktyczne projekty
Wywo ania metod klasy Odtwarzacz w anonimowym obiekcie interfejsu Runnable nie
zawieraj s owa kluczowego this (np. odtwarzaj() zamiast this.odtwarzaj()),
poniewa s owo this u yte w tym kontek cie oznacza oby odwo anie do obiektu inter-
fejsu Runnable, a nie do obiektu klasy zewn trznej.
Zajmijmy si teraz metod odtwarzaj(), która jest wywo ywana w metodzie przygotuj():
Odtwarzacz.java
public boolean odtwarzaj()
{
Item it = null;
if (tryb && p!=null && p.getState() == Player.REALIZED)
{
vc = (VideoControl)p.getControl("VideoControl");
if (vc!=null)
{
it = (Item)vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE,null);
}
}
if (p!=null && p.getState() == Player.REALIZED)
{
try
{
m.wlaczWyswietlacz(it);
p.prefetch();
p.start();
return true;
}
catch (MediaException me)
{
me.printStackTrace();
}
return false;
} else
return false;
}
Powy sza metoda swoje dzia anie uzale nia od zmiennej tryb. Gdy mamy do czynienia
z plikiem wideo (tryb=true), metoda przypisuje do komponentu it wy wietlacz wideo.
Odtwarzacz b d cy w stanie REALIZED mo e zwróci kontrolk interfejsu VideoControl.
Nast pnie wywo ywana jest metoda initDisplayMode(), która zwraca obiekt wy wie-
tlacza wideo. Po wykonaniu opcjonalnej cz ci metody zwi zanej z odtwarzaniem wideo
metoda próbuje ustawi komponent graficzny (je li odtwarzany jest plik audio, wtedy
it==null i metoda wlaczWyswietlacz() nie wykona adnej operacji), a nast pnie roz-
poczyna odtwarzanie pliku.
Odtwarzanie, zw aszcza plików wideo, to proces wymagaj cy u ycia du ej ilo ci
pami ci. Nale y pami ta , e odtwarzanie du ych plików wideo mo e spowodowa
b d krytyczny maszyny wirtualnej i w konsekwencji przerwanie dzia ania aplikacji.
Rozdzia 6. Multimedia w Twoim telefonie 119
javax.microedition.media.control.VideoControl
public Object initDisplayMode(int tryb, Object argument)  zwraca
obiekt zawieraj cy wy wietlany obraz. Wykorzystuje okre lony parametrem
tryb (USE_GUI_PRIMITIVE albo USE_DIRECT_VIDEO) wraz z dodatkowym
argumentem, którego znaczenie zale y od warto ci pierwszego parametru:
USE_GUI_PRIMITIVE  w tym trybie metoda zwróci obiekt, który mo e
stanowi element GUI; w praktyce oznacza to, e b dzie on dziedziczy
z klasy Item i b dzie go mo na doda do formy.
USE_DIRECT_VIDEO  w tym trybie argument musi by obiektem klasy Canvas
(lub dziedzicz cym z niej), a metoda zwraca null; wy wietlany obraz jest
bezpo rednio rysowany w obszarze podanego obiektu.
javax.microedition.media.Manager
public static String[] getSupportedContentTypes(String protokol)
 zwraca list typów MIME obs ugiwanych przez odtwarzacz dla danego
protoko u.
Nagrywanie d wi ku
W kodzie klasy MIDletu dwa razy jest wykorzystywana metoda przechwyc(). W przy-
padku rejestrowania d wi ku lub obrazu pozwolenie na wykonanie takiej czynno ci
jest jednorazowe. Ka da kolejna próba nagrania powoduje wy wietlenie pytania o pozwo-
lenie (tak dzieje si w przypadku emulatora; poszczególne modele telefonów mog
ró ni si pod tym wzgl dem). W zwi zku z tym próba rozpocz cia nagrania wymaga
umieszczenia w nowym w tku:
Odtwarzacz.java
public void przechwyc(boolean czyStart)
{
try
{
if (czyStart)
{
if (!nagrywa)
new Thread(new Runnable(){
public void run()
{
try
{
baos = new ByteArrayOutputStream();
p = Manager.createPlayer("capture://audio");
p.realize();
rc = (RecordControl)p.getControl("RecordControl");
rc.setRecordStream(baos);
rc.startRecord();
p.start();
nagrywa = true;
} catch (Exception e){}
120 J2ME. Praktyczne projekty
}
}).start();
} else
{
if (nagrywa)
{
nagrywa = false;
rc.commit();
p.close();
bufor = baos.toByteArray();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
Metoda przechwyc() obs uguje zarówno rozpocz cie, jak i zako czenie nagrania. Dodat-
kow rol odgrywa zmienna klasy nagrywa; okre la ona stan, w jakim znajduje si odtwa-
rzacz. Dzi ki temu cz zatrzymuj ca nie zostanie wywo ana w stanie zatrzymania
(PREFETCHED) i odwrotnie.
Jak wida , proces nagrywania jest realizowany z u yciem zarówno odtwarzacza, jak
i kontrolki nagrywaj cej, RecordControl. Po utworzeniu kontrolki w klasyczny spo-
sób  przy u yciu metody getControl() odtwarzacza znajduj cego si w stanie REALI
ZED  nale y wywo a metod setRecordStream(), która okre la strumie odbiera-
j cy dane z kontrolki nagrywaj cej. W tym momencie nie pozostaje nic innego, jak
rozpocz nagrywanie i uruchomi odtwarzacz.
Proces ko czenia nagrywania jest prostszy: nale y zako czy dzia anie kontrolki nagry-
waj cej i odtwarzacza, a nast pnie wykorzysta dane ze strumienia (my kopiujemy je do
zmiennej bufor).
javax.microedition.media.control.RecordControl
public void setRecordStream(OutputStream strumien)  ustawia strumie
wyj cia, do którego zapisywane s dane z mikrofonu lub innego urz dzenia
nagrywaj cego.
public void startRecord()  rozpoczyna nagrywanie, o ile odtwarzacz jest
w stanie STARTED.
public void stopRecord()  przerywa nagrywanie. Powoduje przej cie
kontrolki nagrywaj cej w stan wstrzymania. Aby ponownie w czy kontrolk ,
nale y wywo a metod startRecord().
public void commit()  ko czy nagrywanie. W przeciwie stwie do metody
stopRecord() po wywo aniu tej metody nie mo na ponownie wywo a metody
startRecord(). Wymaga to ustawienia nowego strumienia lub adresu
docelowego.
Rozdzia 6. Multimedia w Twoim telefonie 121
public void setRecordLocator(String url)  ustawia adres docelowy dla
zapisywanych danych na podany w parametrze. Mo na stosowa zamiennie
z metod setRecordStream().
Odtwarzanie nagrania
Na obecnym etapie tworzenia klasy Odtwarzacz dysponujemy zmienn bufor, która
zawiera nagranie. Nast pnym krokiem b dzie dodanie do niej dwóch metod wykorzy-
stuj cych t zmienn w celu:
odtworzenia nagrania,
zapisu nagrania do RMS.
Pierwsz z funkcji realizuje metoda odtworzNagranie():
Odtwarzacz.java
public void odtworzNagranie()
{
if (!nagrywa && bufor.length>0)
{
try
{
p = Manager.createPlayer(new ByteArrayInputStream(bufor),"audio/x-wav");
p.realize();
p.prefetch();
p.start();
}
catch (Exception me)
{
me.printStackTrace();
}
}
}
Podstawowym warunkiem wykonania tej metody jest to, aby odtwarzacz nie zapisywa
w a nie adnych danych (nagrywa == false). Dodatkowym zabezpieczeniem przed
odtworzeniem nagrania jeszcze przed jego zarejestrowaniem (np. tu po wy wietleniu
formatki) jest warunek bufor.length>0. Proces odtwarzania jest realizowany wed ug
standardowego schematu. Warto jednak zwróci uwag na parametry metody create
Player(). Tablica jest ponownie przekszta cana na strumie ; jednocze nie wymu-
szamy standardowy typ audio, czyli audio/x-wav.
Tre drugiej z metod jest znacznie krótsza, gdy wi kszo implementacji zosta a uj ta
w klasie Czytnik:
Odtwarzacz.java
public void zapisz(String nazwa) throws Exception
{
if (!nagrywa && bufor.length>0)
{
122 J2ME. Praktyczne projekty
czytnik.zapisz(nazwa,bufor);
bufor = new byte[0];
}
}
W metodzie zapisz()zosta o zastosowane identyczne zabezpieczenie jak w metodzie
odtworzNagranie(). Metoda zapisz() obiektu czytnik zapisuje w nowym rekordzie
zarówno tre nagrania, jak i typ MIME.
Obs uga aparatu
Ostatni skomplikowan funkcj multimedialn do zaprogramowania jest obs uga aparatu
fotograficznego. Równie ona sk ada si z dwóch etapów: zainicjalizowania dzia ania
aparatu oraz wykonania zdj cia. Pierwsza z tych czynno ci do z udzenia przypomina
odtwarzanie pliku wideo:
Odtwarzacz.java
public Item pobierajObraz()
{
Item obrazAparatu = null;
try
{
p = Manager.createPlayer("capture://video");
p.realize();
aparat = (VideoControl)p.getControl("VideoControl");
if (aparat != null)
{
obrazAparatu = (Item)aparat.initDisplayMode(VideoControl.
USE_GUI_PRIMITIVE,null);
}
p.start();
} catch (Exception e)
{
e.printStackTrace();
}
return obrazAparatu;
}
Prosz zwróci uwag , e powy sza metoda ró ni si od odtworzNagranie() jednym,
cho istotnym elementem. Jest to adres, z którego pobierane b d dane  okre lamy go
jako wej ciowe ród o danych wideo  czyli po prostu aparat.
Odtwarzacz dzia a, na formatce formaAparat widnieje komponent klasy Item wy wietla-
j cy obraz z aparatu. Pozostaje udost pni u ytkownikowi mo liwo zrobienia zdj cia:
Odtwarzacz.java
public void pobierzZdjecie()throws Exception
{
if (aparat != null)
{
new Thread(new Runnable(){
public void run()
Rozdzia 6. Multimedia w Twoim telefonie 123
{
try
{
byte[] bufor_zdjecia = aparat.getSnapshot(typZdjecia);
zapisz(typZdjeciaWTypMIME(typZdjecia),bufor_zdjecia);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}).start();
}
}
Na pocz tku, jak zwykle, znajduje si zabezpieczenie  tym razem upewniamy si ,
e kontrolka wideo istnieje. Wykonanie zdj cia, podobnie jak w przypadku nagrania,
wymaga uzyskania zgody, dlatego tre metody znajduje si w nowym w tku. Klu-
czowe wywo anie to getSnapshot(). Zwraca ono tablic bajtów zawieraj c zdj cie
zapisane z u yciem typu podanego w parametrze metody. Nast pnie wykorzystujemy
drug wersj metody zapisz(), która zapisuje dane do RMS z podanym buforem (a nie
z buforem nagrania d wi kowego, jak to mia o miejsce w przypadku pierwszej wersji
tej metody).
Pomocnicza metoda typZdjeciaWTypMIME() przekszta ca nazwy typów w formacie odpo-
wiadaj cym w a ciwo ci video.snapshot.encodings (opisanym wcze niej) na typy MIME:
Odtwarzacz.java
public String typZdjeciaWTypMIME(String typ)
{
if (typ.equals("encoding=jpeg"))
return "image/jpeg";
if (typ.equals("encoding=png"))
return "image/png";
if (typ.equals("encoding=gif"))
return "image/gif";
return "";
}
Przerywanie odtwarzania i zamykanie odtwarzacza
W metodzie obs ugi polece klasy MIDletu pojawia a si metoda wywo ywana np.
przy powrocie z formy formaOdtwarzacz do menu. Jej zadaniem by o przerwanie odtwa-
rzanego strumienia tak, aby mo liwe by o odtworzenie nast pnego. Oto jej tre :
Odtwarzacz.java
public void przerwij()
{
if (p!=null && p.getState() == Player.STARTED)
{
try
{
124 J2ME. Praktyczne projekty
p.stop();
p.close();
aparat = null;
} catch (MediaException me)
{
me.printStackTrace();
}
}
}
Przede wszystkim nale y ponownie rozpatrze warunki przerwania dzia ania odtwa-
rzacza. Nie ma sensu wywo ywa metody, gdy odtwarzacz nie jest zaj ty odtwarzaniem,
st d warunek p.getState() == Player.STARTED. W bloku try zamykamy odtwarzacz
i kontrolk -aparat.
Ostatni istotn metod jest zamkni cie odtwarzacza i zwolnienie zaj tych przez niego
zasobów, co odbywa si przy zamykaniu ca ego MIDletu. Odpowiedzialna za to jest
metoda koniec():
Odtwarzacz.java
public void koniec()
{
try
{
czytnik.koniec();
if (p!=null && p.getState()!=Player.CLOSED)
{
p.close();
p.deallocate();
}
} catch (Exception e)
{
e.printStackTrace();
}
}
Najpierw nale y zako czy prac podleg ego odtwarzaczowi obiektu  czyli obiektu
czytnik. Nast pnie, je li odtwarzacz nie jest zamkni ty, nale y go zamkn oraz bez-
wzgl dnie zwolni jego zasoby.
W klasie Odtwarzacz znajduj si jeszcze cztery pomocnicze metody, a w ród nich
druga wersja metody zapisz():
Odtwarzacz.java
public void zapisz(String nazwa, byte[] dane) throws Exception
{
czytnik.zapisz(nazwa,dane);
}
public String[] pobierzID()
{
return czytnik.pobierzID();
}
public boolean jestObrazek(String nazwa)
Rozdzia 6. Multimedia w Twoim telefonie 125
{
return (nazwa.startsWith("image"));
}
Metoda pobierzID() jest wykorzystywana w klasie MIDletu przy wy wietlaniu for-
matki listaRms, a jestObrazek()  w metodzie przygotuj() przy sprawdzaniu, czy
dany plik jest obrazkiem (wed ug typu MIME).
Wykorzystanie RMS w projekcie
Wszelkiego rodzaju operacje z u yciem RMS oraz innych róde danych, z których
korzysta klasa Odtwarzacz, s zadeklarowane w klasie CzytnikDanych. Niektóre metody
za po rednictwem klasy Odtwarzacz wykorzystuje równie klasa MIDletu. Sama instan-
cja klasy CzytnikDanych jest przechowywana jedynie w klasie Odtwarzacz.
Lista zmiennych niniejszej klasy jest krótka; nie mo e jednak na niej zabrakn klasy
zbioru rekordów, czyli pola zbior klasy RecordStore:
CzytnikDanych.java
private String typ;
private InputStream strumien;
private RecordStore zbior;
private OdtwarzaczMIDlet m;
}
Oprócz zbioru rekordów i egzemplarza klasy MIDletu w kodzie znajduj si dwie bardzo
wa ne zmienne, które s u ywane w metodzie przygotuj() klasy Odtwarzacz (za po red-
nictwem stosownych metod dost pu).
Do inicjalizacji zbioru dochodzi w konstruktorze:
CzytnikDanych.java
package pl.helion.j2mepp.odtwarzacz;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.io.file.*;
import javax.microedition.rms.*;
import javax.microedition.media.*;
public class CzytnikDanych
{
public CzytnikDanych(OdtwarzaczMIDlet p_m)
{
m = p_m;
try
{
zbior = RecordStore.openRecordStore("media",true);
} catch (Exception e){}
}
126 J2ME. Praktyczne projekty
Jak wida , zbiór zawieraj cy nagrania i zdj cia nosi nazw media. Pierwsza metoda,
która wykorzystuje jedynie RMS, to zapisz():
CzytnikDanych.java
public void zapisz(String nazwa, byte[] bufor)
{
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
out.writeUTF(nazwa);
out.write(bufor);
byte[] dane = baos.toByteArray();
zbior.addRecord(dane,0,dane.length);
} catch (Exception e)
{
e.printStackTrace();
}
}
Na pocz tku metody tworzymy strumienie, dzi ki którym dane dowolnych typów pod-
stawowych mo na przekszta ci na tablic bajtów. Nast pnie uzyskane dane zapisujemy
jako nowy rekord. Jak wida , rekord sk ada si z dwóch cz ci: nazwy typu MIME i w a-
ciwej tre ci danych multimedialnych.
Klasa MIDletu do wy wietlenia listy wszystkich rekordów ze zbioru wykorzystuje
metod pobierzID() (po rednio poprzez metod klasy Odtwarzacz o tej samej nazwie):
CzytnikDanych.java
public String[] pobierzID()
{
String[] wyniki = new String[0];
try
{
wyniki = new String[zbior.getNumRecords()];
RecordEnumeration prz = zbior.enumerateRecords(null,null,false);
int i=0;
while (prz.hasNextElement())
{
wyniki[i] = prz.nextRecordId()+"";
i+=1;
}
return wyniki;
}
catch (Exception e)
{
e.printStackTrace();
}
return wyniki;
}
Na pocz tku tablica wyników jest inicjalizowana bez elementów. Nie mo na pozo-
stawi samej deklaracji, gdy w razie problemów z pobraniem wyników ze zbioru rekor-
Rozdzia 6. Multimedia w Twoim telefonie 127
dów zosta aby zwrócona warto null. Proces pobierania rekordów odbywa si za
pomoc obiektu interfejsu RecordEnumeration, aby nie  zgubi  adnego z nich albo nie
odwo ywa si do identyfikatorów nieistniej cych rekordów.
Nieuchronnie zbli amy si do analizy najwa niejszej metody  analizuj():
CzytnikDanych.java
public Player analizuj(String uri)
{
Player p = null;
try
{
String protokol = uri.substring(0,4);
if (protokol.equals("http"))
{
HttpConnection pol = (HttpConnection)Connector.open(uri);
typ = this.rozszerzenieWTyp(uri);
if (typ.startsWith("image"))
strumien = pol.openInputStream();
else
p = Manager.createPlayer(uri);
}
if (protokol.equals("file"))
{
String v = System.getProperty("microedition.io.file.FileConnection.version" );
if (v!=null)
{
typ = this.rozszerzenieWTyp(uri);
if (typ.startsWith("image"))
{
FileConnection ic = (FileConnection)Connector.open(uri,Connector.READ);
strumien = ic.openInputStream();
} else
p = Manager.createPlayer(uri);
}
}
if (protokol.equals(" rms"))
{
String ID = uri.substring(uri.lastIndexOf('/')+1,uri.length());
byte[] bufor = zbior.getRecord(Integer.parseInt(ID));
DataInputStream in = new DataInputStream(new ByteArrayInputStream(bufor));
typ = in.readUTF();
int dlugosc = bufor.length - typ.length();
byte[] dane = new byte[dlugosc];
in.read(dane);
strumien = new ByteArrayInputStream(dane);
if (!typ.startsWith("image"))
p = Manager.createPlayer(strumien, typ);
}
} catch (Exception e)
{
e.printStackTrace();
m.destroyApp(true);
m.notifyDestroyed();
128 J2ME. Praktyczne projekty
}
return p;
}
Jest to najbardziej rozbudowana z metod. Pierwszym wa nym krokiem jest ustalenie
protoko u. Poniewa nazwy obydwu standardowo u ywanych protoko ów (http, file)
sk adaj si z czterech liter, równie nazwa stworzonego przez nas protoko u ("rmsp")
zosta a tak wybrana, aby upro ci kod analizuj cy URL.
Naj atwiej jest pobra dane z internetu. Wystarczy utworzy po czenie HTTP, spraw-
dzi typ MIME (dla obrazków zawsze zaczyna si on od s owa image) i udost pni
strumie lub utworzy obiekt odtwarzacza.
Równie proste jest wczytywanie danych z pliku (protokó file). Ponownie mechanizm
strumieni u yty jest do odczytu obrazków, dla pozosta ych typów danych wykorzy-
stywany jest odtwarzacz.
Ostatnia cz metody analizuj() pobiera dane z RMS. Po pobraniu identyfikatora
rekordu z URL i odczytaniu w a ciwego rekordu sprawdzamy typ MIME (linijka nr 106).
Jedynym problemem pozostaje znalezienie d ugo ci danych  w tym celu wystarczy
jednak odj od ca ej d ugo ci danych d ugo nazwy typu MIME. Nast pnie tworzymy
tablic zawieraj c jedynie tre multimedialn (dane) i przekszta camy j w strumie
wej cia. Analogicznie jak w dwóch poprzednich przypadkach od rodzaju danych uza-
le niamy utworzenie odtwarzacza.
Je li w trakcie wczytywania danych wyst pi jakikolwiek b d, aplikacja musi zako czy
dzia anie.
W metodzie analizuj() pojawi a si metoda konwertuj ca rozszerzenie pliku na przy-
puszczalny typ MIME:
CzytnikDanych.java
public String rozszerzenieWTyp(String uri)
{
String roz = uri.substring(uri.lastIndexOf('.')+1,uri.length());
String typ = "";
if (roz.equals("wav"))
typ = "audio/x-wav";
if (roz.equals("mpg"))
typ = "video/mpeg";
if (roz.equals("mid"))
typ = "audio/midi";
if (roz.equals("jpg"))
typ = "image/jpeg";
if (roz.equals("png"))
typ = "image/png";
if (roz.equals("gif"))
typ = "image/gif";
return typ;
}
Rozdzia 6. Multimedia w Twoim telefonie 129
Na zako czenie dzia ania aplikacji wywo ywana jest metoda koniec(), zamykaj ca
zbiór rekordów:
CzytnikDanych.java
public void koniec()
{
try
{
zbior.closeRecordStore();
}
catch (Exception e)
{
e.printStackTrace();
}
}
W tym celu wykorzystywana jest poznana w rozdziale 3. metoda closeRecordStore().
Ostatnie dwie metody nie zawieraj nic odkrywczego, s to klasyczne metody dost pu:
CzytnikDanych.java
public InputStream getStrumien()
{
return strumien;
}
public String getTyp()
{
return typ;
}
Podsumowanie
Niniejszy MIDlet nale y do najbardziej rozbudowanych projektów opisanych w tej
ksi ce. Mimo zastosowania ró nych interesuj cych metod wiele klas i interfejsów nie
zosta o omówionych z powodu niezmiernie du ej ich liczby, zw aszcza w MMAPI.
Pozostawia to jednak du e pole do popisu, zw aszcza je li chodzi o kontrol procesu
odtwarzania za pomoc kontrolek, takich jak PitchControl, RateControl, TempoControl,
MIDIControl. Tak jak i w poprzednich projektach nie obs ugujemy wszystkich mo li-
wych wyj tków, które mog si pojawi w czasie dzia ania aplikacji  jest to kolejny
temat (wbrew pozorom niebanalny), którym dociekliwy czytelnik powinien si zaj .
Kolejny rozdzia tej ksi ki zawiera opis API zwi zanego ze szczególnym rodzajem
programów, dzi ki którym MIDlety i Java zago ci y na sta e w wiadomo ci u ytkow-
ników telefonów komórkowych  czyli z grami. Co za tym idzie, w nast pnym, a zara-
zem przedostatnim rozdziale  Praktycznych projektów napiszemy razem gr  prost
platformówk .


Wyszukiwarka

Podobne podstrony:
HTML XHTML i CSS Praktyczne projekty Wydanie II htxpp2
Alfabet zarzadzania projektami Wydanie II alzap2
Zarzadzanie projektami Wydanie II zazpr2
Projektowanie zorientowane obiektowo Wzorce projektowe Wydanie II
J2ME Praktyczne projekty
GIMP cwiczenia praktyczne Wydanie II
C cwiczenia praktyczne Wydanie II
JavaScript cwiczenia praktyczne Wydanie II cwjas2

więcej podobnych podstron