Prezentacja do wykładu na temat J2ME, czyli programowania w języku Java midletów na komórki. Omawia bardziej lub mniej dokładnie wszystkie moduły wchodzące w skład standardu MIDP 2.0. Ma 98 slajdów.
- 1. Programowanie na komrki
-
- http://regedit.gamedev.pl/
-
- W prezentacji wykorzystane s fragmenty dokumentacji MIDP 2.1
firmy Sun.
2. Programowanie na komrki
- W czym pisa programy na komrki?
-
- To zaley od klasy telefonu.
(nic) Java Java, C++ i inne... 3. Agenda
4. Wprowadzenie do J2ME J2ME Wireless Toolkit Jzyk Java w J2ME
5. Co to jest J2ME?
-
- J2ME Java 2 Platform, Micro Edition
-
-
- Platforma Java na komrki (inne to J2SE i J2EE)
-
- CLDC Connected Limited Device Configuration
-
- MIDP Mobile Information Device Profile
-
- JSR Java Specification Request
-
-
- Specyfikacje dodatkw (np. JSR-184 to M3G)
- W praktyce uywamy dokumentacji MIDP, ona zawiera te dokumentacj
CLDC
-
- MIDP 1.0 CLCD 1.0, MIDP 2.0 CLDC 1.1
6.
-
- Uywamy tego samego kompilatora javac
- Zupenie nowa biblioteka standardowa
-
- Podajemy niestandardowy classpath
- Liczne ograniczenia sprztu
-
- Niska rozdzielczo wywietlacza, mao kolorw
-
- Due zrnicowanie klawiatur, ekranw, wydajnoci
Jakie jest J2ME? 7. Co jest potrzebne?
-
- Zawiera w sobie JRE - Java Runtime Environment
-
- jEdit, Notatnik, Vim, Emacs, ...
- Wszystko dostpne za darmo ( java.sun.com ).
8. Hello World!
- import javax.microedition.midlet.*;
- import javax.microedition.lcdui.*;
- implements CommandListener
- protected void startApp()
- throws MIDletStateChangeException
- Alert alert = new Alert("Hello World!");
- alert.setCommandListener(this);
- alert.addCommand(new Command("Koniec", Command.EXIT, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(alert);
- protected void pauseApp()
- protected void destroyApp(boolean unconditional)
- throws MIDletStateChangeException
- // Implementacja CommandListener
- public void commandAction(Command c, Displayable d)
- if (c.getCommandType() == Command.EXIT)
9. Rczne budowanie midletu
- Midlet mona zbudowa rcznie z wiersza polece
-
- Preweryfikacja: preverify (WTK)
-
- Napisanie pliku MANIFEST.MF
-
- Utworzenie paczki: jar (JDK)
- ...ale nie trzeba, mona prociej!
10. Wireless Toolkit
- Sun Java(TM) Wireless Toolkit for CLDC
-
- Tytuowy program pakietu Wireless Toolkit
11. Wireless Toolkit
-
- Przechowuje je w Documents and
SettingsLOGINj2mewtkappsNAZWA
-
-
- res obrazki, dwiki i inne zasoby
-
-
- classes, tmpclasses pliki tymczasowe
-
-
- bin pliki wynikowe JAR, JAD
-
- Utworzenie paczki: Create Package
12. Jzyk Java
- Dostpny mamy normalny jzyk Java
-
- byte, short, int, long, boolean, char itd.
-
- float, double od wersji MIDP 2.0
-
- NIE MA generics, enum itp. to jest Java 1.2
13. Wielowtkowo
- J2ME to platforma ograniczona, ale nowoczesna.
-
- Mona, a nawet trzeba pisa wielowtkowo i zajmowa si
synchronizacj.
-
- Sowo kluczowe synchronized
-
- Metody klasy bazowej Object: wait, notify, notifyAll
-
- Klasa Thread, interfejs Runnable
14. Biblioteka standardowa
-
- java.lang Boolean, Character, Integer itd.
-
- java.lang String, StringBuffer
-
- java.lang.Math abs, max, sin, floor, sqrt, ...
-
-
- BRAKUJE exp, log, pow, atan2
-
- java.util.Random generator liczb pseudolosowych
-
- java.util Vector, Stack, Hashtable
15. Midlet javax.microedition.midlet 16. Midlet
- Midlet program na komrk w J2ME
-
- Analogicznie do: aplet, servlet
- NIE MA kolejki komunikatw ani jawnej ptli jak w Windows
API
- JEST sterowany zdarzeniami, jak programy w Delphi czy C#
17. Midlet szkielet klasy
- importjavax.microedition.midlet .*;
- public class HelloWorld extendsMIDlet
- protected voidstartApp ()
- throws MIDletStateChangeException
- protected voidpauseApp ()
- protected voiddestroyApp (boolean unconditional)
- throws MIDletStateChangeException
18. Midlet - zdarzenia
-
- Dokona inicjalizacji, wczyta zasoby, pokaza co na ekranie
-
- Jeli nie udaje si uaktywni, rzuci wyjtek
MIDletStateChangeException
-
- Jeli nieodwracalny bd, wywoa notifyDestroyed
-
- Program staje si nieaktywny
-
- Zwolni wszystkie zasoby zajmujce duo procesora lub pamici
- destroyApp(boolean unconditional)
-
- Jeli odmawia wyczenia, rzuci wyjtek MIDletStateChangeException
(tylko jeli unconditional == false)
19. Midlet zmiana stanu
-
- Wywoa jeli program chce si zakoczy
-
- destroyApp nie zostanie ju wywoane!
-
- Wywoa jeli program chce si sta nieaktywny
-
- Wywoa jeli program chce si sta aktywny
- platformRequest(String URL)
-
- Wywoa aby system obsuy podany URL, np. tel:NUMER
20. GUI javax.microedition.lcdui 21. GUI - Klasy
22. Wysoki i niski poziom
-
- Zawiera: kontrolki GUI i polecenia
-
- Dla: aplikacji biznesowych
-
- Abstrakcyjne, niezalene od rozdzielczoci
-
- Rysowane wg stylu danego telefonu
-
- Zawiera: moliwo rysowania i reakcji na wejcie z klawiatury
-
- Zalene od wywietlacza i klawiatury danego telefonu
-
- Wygld i obsuga implementowane samodzielnie
23. Alert
- Alert ekran z komunikatem tekstowym
-
- Co jak znany z Windowsa MessageBox :)
- // Utwrz ekran komunikatu
- "Nie mona otworzy pliku.", // alertText
- AlertType.ERROR);// alertType
- // Pobierz singleton wywietlacza
- Display display =Display.getDisplay (this);
- // Poka komunikat na wywietlaczu
- display. setCurrent (alert);
24. Command i CommandListener
- Zaimplementowa w jakiej klasie L interfejs CommandListener
- Utworzy jaki ekran E typu pochodnego od Displayable
- Wywoa: E. setCommandListener (L_obj);
- Wywoa dowoln liczb razy: E. addCommand ( new Command (label,
commandType, priority));
- Pokaza E na wywietlaczu: display. setCurrent (E);
25. Command i CommandListener
- public class TestMidlet extends MIDlet
implementsCommandListener
- protected void startApp() throws
MIDletStateChangeException
- Alert alert = new Alert("Wyjcie", "Czy na pewno chcesz
wyj?",
- alert. setCommandListener (this);
- alert. addCommand (newCommand ("Zakocz", Command.EXIT,
0));
- alert. addCommand (newCommand ("Wr", Command.BACK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(alert);
- public voidcommandAction (Command c, Displayable d)
- if (c. getCommandType () == Command.EXIT)
- else if (c. getCommandType () == Command.BACK)
- Display.getDisplay(this).setCurrent(m_OtherScreen);
26. Command
- commandType semantyka (znaczenie) Stae: Command.BACK, CANCEL,
EXIT, HELP, OK, SCREEN, STOP, do pozostaych ITEM
27. Command
- Telefon sam okrela rozmieszczenie i sposb uruchamiania
polece
- Kiedy polece jest duo, zapewnia menu
28. Obrazek
- Obrazek w pamici reprezentuje klasa Image
- Obrazek moe by Mutable lub Immutable
- Jedyny na pewno wspierany format to PNG
29. Obrazek - wykorzystanie
- Image image =Image.createImage ("/Ikonka.png");
- "Czy na pewno chcesz wyj?",
- alert.setCommandListener(this);
- alert.addCommand(new Command("Zakocz", Command.EXIT, 0));
- alert.addCommand(new Command("Wr", Command.BACK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(alert);
- catch ( java.io.IOExceptione)
Plik w podkatalogu res/ 30. Lista
- protected void startApp() throws
MIDletStateChangeException
- m_List = newList ("Lista",Choice.EXCLUSIVE );
- m_List. append ("Opcja 1", null);
- m_List. append ("Opcja 2", null);
- m_List. append ("Opcja 3", null);
- m_List.setCommandListener(this);
- m_List.addCommand(new Command("Zakocz", Command.EXIT, 0));
- m_List.addCommand(new Command("OK", Command.OK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_List);
- public void commandAction(Command c, Displayable d)
- if (c.getCommandType() == Command.EXIT)
- else if (c.getCommandType() == Command.OK)
- GoFurther(m_List. getSelectedIndex ());
31. Lista wielokrotnego wyboru
- protected void startApp() throws
MIDletStateChangeException
- m_List = new List("Lista",Choice.MULTIPLE );
- m_List.append("Opcja 1", null);
- m_List.append("Opcja 2", null);
- m_List.append("Opcja 3", null);
- m_List.setCommandListener(this);
- m_List.addCommand(new Command("Zakocz", Command.EXIT, 0));
- m_List.addCommand(new Command("OK", Command.OK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_List);
- public void commandAction(Command c, Displayable d)
- if (c.getCommandType() == Command.EXIT)
- else if (c.getCommandType() == Command.OK)
- GoFurther(m_List. isSelected (0), m_List. isSelected (1),
m_List. isSelected (2));
32. Lista jako menu
- protected void startApp() throws
MIDletStateChangeException
- m_List = new List("Lista",Choice.IMPLICIT );
- m_List.append("Opcja 1", null);
- m_List.append("Opcja 2", null);
- m_List.append("Opcja 3", null);
- m_List.setCommandListener(this);
- m_List. setSelectCommand (new Command("Wybierz", Command.ITEM,
0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_List);
- public void commandAction(Command c, Displayable d)
- if (c.getCommandType() == Command.ITEM)
- GoFurther(m_List.getSelectedIndex());
33. Czcionka
- Fontfont =Font. getFont (
- m_List = new List("Lista", Choice.IMPLICIT);
- m_List.append("Opcja 1", null);
- m_List.append("Opcja 2", null);
- m_List.append("Opcja 3", null);
- m_List. setFont (0, font);
- m_List. setFont (1, font);
- m_List. setFont (2, font);
34. Czcionka
- face : FACE_MONOSPACE FACE_PROPORTIONAL FACE_SYSTEM
- style : STYLE_BOLD STYLE_ITALIC STYLE_PLAIN
STYLE_UNDERLINED
- size : SIZE_LARGE SIZE_MEDIUM SIZE_SMALL
- Nie zawsze dostajemy podane, rnice si czcionki!
35. TextBox
- protected void startApp() throws
MIDletStateChangeException
- m_TextBox = newTextBox ("Login", "", 32, 0);
- m_TextBox.setCommandListener(this);
- m_TextBox.addCommand(new Command("OK", Command.OK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_TextBox);
- public void commandAction(Command c, Displayable d)
- if (c.getCommandType() == Command.OK)
- GoFurther(m_TextBox. getString ());
36. TextBox - Constraints
- Ograniczenia: TextField.ANY TextField.EMAILADDR
TextField.NUMERIC TextField.PHONENUMBER TextField.URL
TextField.DECIMAL
- Modyfikatory: TextField.PASSWORD TextField.UNEDITABLE
TextField.SENSITIVE TextField.NON_PREDICTIVE
TextField.INITIAL_CAPS_WORD TextField.INITIAL_CAPS_SENTENCE
37. Formularz
- m_Form = newForm ("Formularz");
- item =newStringItem ("Twoje dane", "Tu wpisz swoje dane",
0);
- item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
- item =newTextField ("Imi", "Twoje imi", 32, 0);
- item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
- item = new TextField("Nazwisko", "Twoje nazwisko", 32, 0);
- item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
- m_Form.setCommandListener(this);
- m_Form.addCommand(new Command("OK", Command.OK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_Form);
- Kilka rnych kontrolek na jednym ekranie.
38. Kontrolki statyczne
- m_Form = new Form("Formularz");
- image = Image.createImage("/Ikonka2.png");
- catch (java.io.IOException e)
- m_Form.append(newStringItem (null, "Napis...",
Item.PLAIN));
- m_Form.append(newSpacer (32, 32));
- m_Form.append(newImageItem (null, image,
ImageItem.LAYOUT_DEFAULT, null));
- m_Form.setCommandListener(this);
- m_Form.addCommand(new Command("OK", Command.OK, 0));
- Display display = Display.getDisplay(this);
- display.setCurrent(m_Form);
39. TextField
- Pole do wprowadzania tekstu
- Flagi takie same jak dla TextBox
- m_Form.append(newTextField (
40. Gauge
- Suwak do wybierania wartoci liczbowej
41. DateTime
- m_Form.append(newDateField (
- "Data",DateField.DATE ));
- m_Form.append(newDateField (
- "Czas",DateField.TIME ));
- m_Form.append(newDateField (
- "Data i czas",DateField.DATE_TIME ));
42. ChoiceGroup
- Lista, podobnie jak ekran List
- "Opcja 1", "Opcja 2", "Opcja 3"
- m_Form.append(newChoiceGroup (
- Choice.EXCLUSIVE , // choiceType
43. ChoiceGroup - rodzaje
44. Alert raz jeszcze - Indicator
- Inne zastosowanie kontrolki Gauge
-
- Pokazywanie postpu wewntrz ekranu Alert
- "Trwa adowanie gry, prosz czeka...",
- alert. setIndicator (newGauge (
- alert.setTimeout(Alert.FOREVER);
Musi tak by Flagi: INDEFINITE, CONTINUOUS_IDLE,
CONTINUOUS_RUNNING, INCREMENTAL_IDLE, INCREMENTAL_UPDATING 45.
Ticker
- Tekst przelatujcy u gry ekranu
-
- Dostpny na dowolnym ekranie metoda setTicker klasy
Displayable
- "Trwa adowanie gry, prosz czeka...",
- alert.setTimeout(Alert.FOREVER);
- Ticker ticker = newTicker ("REKLAMA!!!");
- alert. setTicker (ticker);
46. Timer, TimerTask
- java.util.Timer pozwala zakolejkowa zadania do wykonania za/co
okrelony czas
- java.util.TimerTask klasa bazowa dla zada
- Kady Timer to osobny wtek
-
- Tre zadania jest wykonywana w osobnym wtku.
-
- Czy nie warto czasem napisa wasny wtek zamiast uywa
Timera?
47. Timer - przykad
- protected void startApp()
- throws MIDletStateChangeException
- "Trwa adowanie gry, prosz czeka...",
- alert.setTimeout(Alert.FOREVER);
- m_Gauge = new Gauge(null, false, 9, 0);
- alert.setIndicator(m_Gauge);
- Display display = Display.getDisplay(this);
- display.setCurrent(alert);
- m_Timer =new java.util.Timer ();
- m_Timer. schedule (new MyTask(), 500, 500);
- extends java.util.TimerTask
48. Wejcie-wyjcie java.io 49. Wejcie-wyjcie
- Pakiet java.io - strumienie
50. Wejcie-wyjcie
- InputStream- abstrakcyjna klasa bazowa do odczytywania danych
binarych jako bajty
- OutputStream- abstrakcyjna klasa bazowa do zapisywania bajtw
jako dane binarne
- DataInput- interfejs do odczytywania danych binarnych jako rne
typy
-
- DataInputStream- nakadka na InputStream do odczytywania danych
binarnych jako rne typy
- DataOutput- interfejs do zapisywania rnych typw jako dane
binarne
-
- DataOutputStream- nakadka na OutputStream do zapisywania rnych
typw jako dane binarne
- Writer abstrakcyjna klasa bazowa do zapisywania znakw
-
- OutputStreamWriter- nakadka na strumie zapisujca do niego
znaki
- Reader- abstrakcyjna klasa bazowa do odczytywania znakw
-
- InputStreamReader- nakadka na strumie odczytujca z niego
znaki
51. Wczytanie pliku tekstowego
- this. getClass().getResourceAsStream ("/Test.txt");
- StringBuffer sb = new StringBuffer();
- while ( (i = is. read ()) != -1 )
- catch ( java.io.IOExceptione)
52. Wczytanie pliku binarnego
- this.getClass().getResourceAsStream("/Test.bin");
- java.io.DataInputStreamdis =
- new java.io.DataInputStream(is);
- catch (java.io.IOException e)
- // Plik resTest.bin (Big Endian!)
53. Internet javax.microedition.io 54. Internet
- HTTP javax.microedition.io.HttpConnection
- HTTPS, SSL/TLS javax.microedition.io.HttpsConnection
javax.microedition.io.SecureConnection
- TCP, UDP javax.microedition.io.SocketConnection
javax.microedition.io.ServerSocketConnection
javax.microedition.io.DatagramConnection
javax.microedition.io.UDPDatagramConnection
- Push javax.microedition.io.PushRegistry
- Port szeregowy javax.microedition.io.CommConnection
55. HTTP - przykad
- import javax.microedition.io.*;
- (HttpConnection) Connector.open ("http://www.google.pl");
- int ResponseCode = c. getResponseCode ();
- if (ResponseCode != HttpConnection.HTTP_OK)
- String ContentType = c. getType ();
- int Length = (int)c. getLength ();
- InputStream is = c. openInputStream ();
- catch (java.io.IOException e)
56. Grafika 2D
57. Canvas
- Klasajavax.microedition.lcdui.Canvas
-
- Ekran cakowicie do dyspozycji dla programisty
-
- Rczne rysowanie i obsuga wejcia
-
- Zdefiniowa klas dziedziczc zCanvas
-
- Zaimplementowa metody: Obowizkowo:paint
Opcjonalnie:sizeChanged, showNotify, hideNotify, keyPressed,
keyReleased, keyRepeated, pointerDragged, pointerPressed,
pointerReleased
58. Canvas - przykad
- private class MyCanvasextends Canvas
- protected voidpaint ( Graphicsg)
- g.fillRect(0, 0, getWidth(), getHeight());
- g.drawString("Hello World!", 4, 4,
- Graphics.TOP | Graphics.LEFT);
- protected void startApp()
- throws MIDletStateChangeException
- MyCanvas canvas = new MyCanvas();
- Display display = Display.getDisplay(this);
- display.setCurrent(canvas);
59. Sprawdzanie moliwoci
- Pami Runtime rt = Runtime.getRuntime(); rt.totalMemory(),
rt.freeMemory()
- Wywietlacz Display d = Display.getDisplay(this); d.isColor(),
d.numColors(), d.numAlphaLevels()
- Canvas c.getWidth(), c.getHeight(), c.isDoubleBuffered(),
c.hasPointerEvents(), c.hasPointerMotionEvents(),
c.hasRepeatEvents()
60. Rnorodno moliwoci
-
- Zestaw wymaganych klawiszy + niestandardowe
-
- Problemy z klawiszami wciskanymi jednoczenie
-
- Bardzo rnorodne rozdzielczoci 128x128, 128x160 176x220, 240x320
i inne...
-
- Niektre ekrany s wysze, inne szersze! 640x200, 320x240 i
inne...
-
- FullScreen nawet wtedy mog pozosta paski!
canvas.setFullScreenMode(true);
61. Graphics ustawienia
62. Graphics rysowanie
- g. drawLine (4, 4, 32, 32);
- g. drawRect (36, 4, 28, 28);
- g. drawRoundRect (68, 4, 28, 28, 16, 16);
- g. drawArc (100, 4, 28, 28, 20, 200);
- g. fillTriangle (4, 36, 32, 50, 4, 64);
- g. fillRect (36, 36, 28, 28);
- g. fillRoundRect (68, 36, 28, 28, 16, 16);
- g. fillArc (100, 36, 28, 28, 20, 200);
63. Graphics tekst, obrazek
- g. drawString ("Hello World!", getWidth()/2, 4,
- Graphics. TOP| Graphics. HCENTER );
- g. drawImage (m_Image, getWidth()/2, getHeight()/2,
- Graphics. HCENTER| Graphics. VCENTER );
-
- Anchor: Graphics.BOTTOM, TOP, VCENTER, BASELINE, LEFT, VCENTER,
RIGHT
64. Canvas - klawiatura
- private class MyCanvas extends Canvas
- protected voidkeyPressed (intkeyCode )
- protected voidkeyReleased (intkeyCode )
- protected voidkeyRepeated (intkeyCode )
Canvas.KEY_NUM0 KEY_NUM9 KEY_STAR (*) KEY_POUND (#) if (keyCode
> 0) char ch = (char)keyCode; Niestandardowe... Dziaa tylko jeli
hasRepeatEvents() 65. Klawisze do gier
- Mapowanie klawiszy zwykych na akcje gry: getGameAction
- Stae akcji gry: Canvas.UP, DOWN, LEFT, RIGHT, FIRE, GAME_A,
GAME_B, GAME_C, GAME_D
- protected void keyPressed(int keyCode)
- int game_action =getGameAction (keyCode);
- if (game_action == Canvas. FIRE )
- else if (game_action == Canvas. UP )
66. Programowanie gier 2D
67. GameCanvas
- Pakietjavax.microedition.lcdui.game
-
- Klasy przeznaczone do pisania gier 2D
-
- Zapewnie podwjne buforowanie obrazu
-
- Umoliwia odpytywanie o wcinite klawisze
- Ptl gry trzeba zrealizowa samemu
68. Ptla gry propozycja
- Graphics g = getGraphics();
- int keyState =getKeyStates() ;
- if ((keyState & LEFT_PRESSED ) !=0)
- getWidth(), getHeight());
- flushGraphics() ; // Koniec rysowania
- protected void startApp()
- throws MIDletStateChangeException
- m_MyCanvas = new MyCanvas();
- Display display = Display.getDisplay(this);
- display.setCurrent(m_MyCanvas);
- m_Thread = newThread (m_MyCanvas);
69. Wejcie z klawiatury
- getKeyStates() Zwraca flagi bitowe z wcinitymi w danej chwili
klawiszami
- super(false); Zdarzenia keyPressed, keyReleased, keyRepeated
nie bd generowane - wydajno!
-
-
- LEFT_PRESSED RIGHT_PRESSED UP_PRESSED DOWN_PRESSED
-
-
- GAME_A_PRESSED GAME_B_PRESSED GAME_C_PRESSED
GAME_D_PRESSED
70. Pomiar czasu i FPS
- long StartTime =System.currentTimeMillis() ;
- int FpsCounter = 0, Fps = 0;
- int KeyStates = getKeyStates();
- CalcFrame (t, dt, KeyStates);
- t =System.currentTimeMillis()- StartTime;
- if (LastFpsTime + 1000 0 fragment obrazka rdowego
- Zastosowanie np. animowana woda
78. Sprite - kolizje
- Wsparcie dla kolizji midzy obiektami
-
- Take z kafelkami TiledLayer
-
- Take na poziomie przezroczystoci pojedynczych pikseli !!!
79. LayerManager
- Klasa upraszczajca zarzdzanie obiektami 2D
-
- Jej wykorzystanie jest opcjonalne.
- Przechowuje list obiektw klasy Layer
-
- Pozwala je narysowa jednym wywoaniem
- Oddzielenie prostokta ekranu od prostokta rysowanej sceny
-
- Zaleta #1: Rysowanie widoku tylko w ograniczonym
prostokcie
-
- Zaleta #2: Przewijanie mapy
80. Kilka drobiazgw Wibracja Waciwoci systemu Obsuga bdw 81.
Wibracja
-
- Chyba, e gracz ma joypad z Force Feedback i uywasz
DirectInput...
- Display display = Display.getDisplay(this);
- Wywoanie jest asynchroniczne nie blokuje
- Podawany czas jest w milisekundach
-
- 0 oznacza wyczenie wibracji
82. Waciwoci systemu
- Waciwoci standardowe microedition.profiles
microedition.configuration microedition.locale itd...
- Waciwoci dodatkowe microedition.m3g.version
Bluetooth.api.version video.encodings itd...
83. Obsuga bdw
- Trzeba zawsze apa wyjtki lub deklarowa ich zgaszanie
-
-
- java.io.IOException podczas wczytywania plikw
-
-
- java.lang.InterruptedException przy oczekiwaniu w Thread, np.
join(), sleep()
- W emulatorze dziaaSystem.out.println()
-
- A wic takeThrowable.printStackTrace()
- image = Image.createImage("/Obrazek.png);
- catch ( java.io.IOExceptione) {
84. Baza danych javax.microedition.rms.RecordStore 85. Baza
danych???
- MIDP nie daje dostpu do systemu plikw
-
- Chyba, e przez rozszerzenie JSR-75
-
- Nie ma innej moliwoci zachowania trwaych danych ni RMS
- RMS Record Management System
-
- Pakietjavax.microedition.rms , klasaRecordStore
-
- Aplikacja moe tworzy i uywa baz danych. Kada ma nazw.
-
- Baza danych skada si z rekordw. Kady ma identyfikator oraz tre
surowe dane binarne.
86. Dodawanie rekordu
- import javax.microedition.rms.*;
- RecordStorers = RecordStore. openRecordStore ("Baza1",
true);
- ByteArrayOutputStreambaos = new ByteArrayOutputStream();
- DataOutputStreamdos = new DataOutputStream(baos);
- dos.writeUTF("Mieczysaw");
- byte[] data = baos.toByteArray();
- int rec_id = rs. addRecord (data, 0, data.length);
- catch (RecordStoreException e) { }
- catch (IOException e) { }
87. Enumeracja rekordw
- RecordStore rs = RecordStore.openRecordStore("Baza1",
true);
- RecordEnumerationre = rs. enumerateRecords (null, null,
false);
- while (re. hasNextElement ())
- int id = re. nextRecordId ();
- ByteArrayInputStreambais =
- new ByteArrayInputStream(rs. getRecord (id));
- DataInputStreamdis = new DataInputStream(bais);
- String name = dis.readUTF();
- int score = dis.readInt();
- System.out.println(name + " - " + score);
- catch (RecordStoreException e) { }
- catch (IOException e) { }
88. Enumeracja - filtrowanie
- private class MyFilterimplements RecordFilter
- public booleanmatches (byte[] candidate)
- ByteArrayInputStream bais = new
ByteArrayInputStream(candidate);
- DataInputStream dis = new DataInputStream(bais);
- String name = dis.readUTF();
- int score = dis.readInt();
- catch (IOException e) { e.printStackTrace(); return false;
}
- RecordEnumeration re = rs.enumerateRecords( new MyFilter() ,
null, false);
89. Enumeracja - sortowanie
- private class MyComparatorimplements RecordComparator
- public intcompare (byte[] rec1, byte[] rec2)
- ByteArrayInputStream bais1 = new
ByteArrayInputStream(rec1);
- ByteArrayInputStream bais2 = new
ByteArrayInputStream(rec2);
- DataInputStream dis1 = new DataInputStream(bais1);
- DataInputStream dis2 = new DataInputStream(bais2);
- int score1 = dis1.readInt();
- int score2 = dis2.readInt();
- String name1 = dis1.readUTF();
- String name2 = dis2.readUTF();
- int cmp = name1.compareTo(name2);
- if (cmp < 0)returnRecordComparator.PRECEDES ;
- else if (cmp == 0) returnRecordComparator.EQUIVALENT ;
- elsereturnRecordComparator.FOLLOWS ;
- return RecordComparator.PRECEDES;
- RecordEnumeration re = rs.enumerateRecords(null,new
MyComparator() , false);
90. Inne moliwoci
- Operacje na rekordach addRecord, getRecord, getRecordSize,
deleteRecord
- Nasuchiwanie zmian addRecordListener, removeRecordListener,
interfejs RecordListener
- Informacje o bazie danych getNumRecords, getSize,
getSizeAvailable, getLastModified, getVersion
- Operacje na bazach danych listRecordStores, openRecordStore,
deleteRecordStore
- Wspdzielenie baz danych midzy midletami...
91. MIDP 2.0 Media API javax.microedition.media 92. MIDP 2.0
Media API
- Zapewnia podstawowe API do odtwarzania multimediw
-
- Rozszerzane przez Mobile Media API (JSR-135)
- Nie gwarantuje obsugi adnych formatw
-
- Jedynie proste generowanie odgosw
93. MIDP 2.0 Media API
-
- Dostarcza informacji na temat moliwoci multimedialnych
urzdzenia
-
- Umoliwia tworzenie Playerw
-
- Odtwarza konkretny zasb multimedialny
-
- Pozwala na sterowanie odtwarzaniem
-
- Pozwala na pobieranie kontrolerw
-
- Pozwala na regulacj parametrw odtwarzania, np. gonoci
94. Odtwarzanie dwiku
- Player p =Manager.createPlayer
("http://adres.pl/ding.wav");
- catch (IOException ioe) { }
- catch (MediaException me) { }
- InputStream is =
getClass().getResourceAsStream("/ding.wav");
- Player p =Manager.createPlayer (is, "audio/X-wav");
- catch (IOException ioe) { }
- catch (MediaException me) { }
95. Obsugiwane formaty
- Content Type typ MIME, np.:
-
- Tone sequence:audio/x-tone-seq
96. Player stany 97. Rozszerzenia MIDP 2.0 to nie koniec... 98.
Przykady rozszerze
-
- Mobile 3D Graphics API M3G (JSR-184)
-
- Mobile Media API (JSR-135)
- Dostp do danych PIM (kontakty itp.)
-
- Java APIs for Bluetooth (JSR-82)
-
- Wireless Messaging API WMA (JSR-120)