Wykład 1 - Paweł Fiderek

Report
Programowanie
urządzeń mobilnych
Paweł Fiderek
2011
Organizacja zajęć
Wykład:
10 godzin wykładu zorganizowane w postaci
5 dwugodzinnych wykładów
Zaliczenie:
2 kolokwia laboratoryjne
Sobota zjazd 6-10 godz. 16:15 -18:00
Sala: E110
Katedra Informatyki Stosowanej
2
Organizacja wykładu - zagadnienia
1.
2.
3.
4.
5.
6.
7.
Podstawy budowy i programowania urządzeń mobilnych (telefon
komórkowy, PDA - Personal Digital Assistant)
Wprowadzenie do Javy MicroEdition (J2ME)
GUI w J2ME
Połączenia sieciowe w J2ME
Wprowadzenie do programowania urządzeń mobilnych z
systemem Windows Mobile
GUI w Windows Mobile
Składowanie danych w urządzeniach mobilnych przy
wykorzystaniu Windows Mobile
Katedra Informatyki Stosowanej
3
Konsultacje
• [email protected]
• Soboty/Niedziele zjazdowe – po uzgodnieniu
mailowym
• Dni powszednie – „stary kis” 12-13 (najlepiej
po konsultacji mailowej)
Katedra Informatyki Stosowanej
4
Podstawy budowy i programowania
urządzeń mobilnych
(telefon komórkowy, PDA Personal Digital Assistant)
Katedra Informatyki Stosowanej
5
Urządzenie mobilne - definicja
• Urządzenie mobilne – (przenośne) urządzenie
elektroniczne pozwalające na przetwarzanie,
odbieranie oraz wysyłanie danych bez
konieczności utrzymywania przewodowego
połączenia z siecią. Urządzenie mobilne może być
przenoszone przez użytkownika bez konieczności
angażowania dodatkowych środków. Typowym
zastosowaniem może być odbieranie i wysyłanie
poczty elektronicznej oraz przeglądanie stron
sieci WWW za pomocą aplikacji mobilnych.
Katedra Informatyki Stosowanej
6
Przykłady urządzeń mobilnych
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Palmtop – komputer kieszonkowy
MDA – Mobile Digital Assistant
telefon komórkowy
smartfon
Nintendo DS – przenośna konsola do gier
notebook – osobisty komputer przenośny
pocket PC – komputer kieszonkowy
pendrive – przenośna pamięć typu Flash
odtwarzacz MP3
odtwarzacz MP4/MTV, PMP
PlayStation Portable – przenośna konsola gier
aparat cyfrowy
czytnik kart pamięci
przenośne urządzenia do nawigacji satelitarnej GPS
Katedra Informatyki Stosowanej
7
CDC(Connected Device Configuration)
Konfiguracja CDC (ang. Connected Device Configuration) jest
konfiguracją środowiska Java ME zdefiniowanych przez Java
Community Process.
Konfiguracja CDC przeznaczona jest dla urządzeń wyposażonych w ok.
2048 kB pamięci i pracujących z 32-bitowymi procesorami, czyli np.
dla wideotelefonów konsol gier, zestawów audio-wideo, PDA.
Specyfikacja znajduje się w dokumentacji JSR-36 i JSR-218. Jest ona
przeznaczona dla urządzeń posiadających:
•
stałe połączenie z siecią,
•
32 bitowy procesor,
•
minimum 512KB dostępnej pamięci ROM,
•
minimum 256KB pamięci operacyjnej RAM,
•
graficzny interfejs użytkownika.
Katedra Informatyki Stosowanej
8
Konfiguracja CLDC (ang. Connected Limited Device Configuration) jest
bardziej ograniczoną wersją CDC i jest zdefiniowany przez Java
Community Process.
Konfiguracja CLDC jest przeznaczona dla urządzeń wyposażonych w
około 512 kB pamięci i pracujących z 16- lub 32-bitowymi
procesorami, czyli np. dla telefonów komórkowych, notesów
elektronicznych czy pagerów.
W stosunku do CDC , CLDC brakuje między innymi:
• obsługę działań na liczbach zmiennoprzecinkowych,
• uruchamianie kodu natywnego dzięki JNI (ang. Java Native
Interface),
• obsługę słabych referencji,
• serializację obiektów,
• definiowanie przez użytkownika loaderów klas,
• obsługę mechanizmu debugowania.
Katedra Informatyki Stosowanej
9
J2ME - Mobile Information Device
Profile (MIDP)
•
•
•
•
•
•
•
•
MIDP jest uzupełnienie konfiguracji CLDC o odpowiednie klasy języka Java przeznaczone dla urządzeń
mobilnych jak np. telefony komórkowe. Specyfikacja MIDP jest rozwijana przez Java Community Process
(JCP).
W 2000 r. udostępniono wersję 1.0.
W 2002 roku wersję 2.0 MIDP.
Programy napisane z wykorzystaniem MIDP noszą nazwę MIDletów (szerzej o MIDletach będzie
mowa w dalszej części wykładu oraz na laboratorium). Uruchamiane są w środowisku K virtual machine.
Profil MIDP zawiera bardziej rozbudowaną obsługę platformy Java niż sama konfiguracja CLDC .
MIDP wymagają zatem więcej pamięci. Specyfikacja CLDC wymaga przynajmniej 120 kB pamięci RAM
(Random Accesss Memory) na przechowywanie specyfikacji MIDP, oraz co najmniej 32 kB na stos. Oprócz
tego wymaga minimum 8 kB pamięci nieulotnej,jest ona potrzebna, aby MIDlety mogły zapisywać dane –
np.. Adresy i nr telefony w przypadku MIDletu pracującego jako książka adresowa.
Urządzenia korzystające z MIDP powinny być wyposażone w ekrany umożliwiające wyświetlenie co
najmniej dwóch kolorów w rozdzielczości minimum 96 na 54 pikseli.
Oprócz tego , do komunikacji z użytkownikiem posiadać powinny jedno lub więcej następujących
mechanizmów: klawiatura telefonu, klawiatura QWERTY, ekran dotykowy.
Ich wyposażenie musi także zapewniać obsługę protokołu HTTP 1.1.
Katedra Informatyki Stosowanej
10
Wymagania programowe
Minimalne założenia:
•
Minimalne jądro do zarządzania sprzętem (np. obsługa przerwań, wyjątków, minimalne
szeregowanie). Jądro musi zapewnić co najmniej jeden szeregowany wątek, by uruchomić
Virtualną Maszynę Javy.
•
Mechanizm czytania i pisania z nieulotnej pamięci aby utrzymać API
•
dostęp do czytania i pisania w bezprzewodowej sieci urządzenia aby utrzymać API
•
mechanizm zapewniający zapisywanie znaczników czasowych w rekordach zapisanych w
zasobach pamięci trwałej
•
minimalna zdolność do zapisywania w mapie bitowej graficznego wyświetlacza
•
mechanizm przechwytujący dane z wejścia z jednego (lub więcej) z trzech urządzeń
•
mechanizm zarządzający cyklem życia aplikacji urządzenia
Katedra Informatyki Stosowanej
11
Architektura MIDP
Katedra Informatyki Stosowanej
12
Zmiany w MIDP 2.0, w stosunku do
MIDP 1.0
• Rozszerzony interfejs użytkownika
 Popup ChoiceGroup, Alert ekranu
• Media Support Media Support
 .wav, możliwość wykorzystania mediów strumieniowych
• Game Support
 Game API - sprite'y i warstwy
• Expanded Connectivity (Rozszerzona Łączność)
 HTTP, HTTPS, SSL, WTLS, certyfikaty X.509
• Push Architecture
 Komunikaty i powiadomienia wprost do aplikacji
• Over-the-air (OTA) Provisioning
• End-to-end Security
 HTTPS, SSL, WTLS, podpis elektroniczny
Katedra Informatyki Stosowanej
13
J2ME – MIDlet, budowa i przykład
Katedra Informatyki Stosowanej
14
Szkielet MIDletu
• import javax.microedition.midlet.MIDlet;
• public class PierwszyMIDlet extends MIDlet {
• public void startApp(){
• }
• public void pauseApp(){
• }
• public void destroyApp(boolean){
• }
•
/** Opcjonalny konstruktor:**/
• }
Katedra Informatyki Stosowanej
15
MIDlet musi mieć również publiczny bezargumentowy konstruktor :
public NazwaKlasy() {}
W przypadku zwykłej aplikacji, napisanej w języku JAVA, metoda wywoływania inicjalizacji
obiektów była statyczną metodą main(), w przypadku MIDletu jest to
public void startApp() {}
MIDlet może ulec zawieszeniu, w tym celu wywołać można metodę
public void pauseApp() {}
W tym momnecie MIDlet zwalnia swoje zasoby, zawieszone jest działanie "timerów".
Ekran wówczas może być przekazany np. innemu MIDletowi.
W stan zawieszenia może również dobrowolnie wprowadzić siebie aplikacja.
Dokonuje tego wywołując metodę
Public notifyPaused() {}
W przypadku wywołania metody notifyPaused() platforma nie wywołuje już metody
pauseApp(). Zakłada, że MIDlet wywołując metodę notifyPaused() jest już gotowy do
przejścia w stan zawieszenia. Dlatego metoda pauseApp() często poprzedza wywołanie
metody notifyPaused().
Katedra Informatyki Stosowanej
16
Aby powrócić ze stanu zawieszenia w stan aktywny, MIDlet wywołuje bezargumentową metodę
resumeRequest() {}
Informuje ona informuje maszynę wirtualną, że MIDlet jest gotowy do działania. Uruchomiony
zostanie, gdy tylko przydzielone mu będą odpowiednie zasoby, co nastąpi, gdy takie będą (np..
Zwolni je inny MIDlet). W przypadku powrotu ze stanu zawieszenia w stan aktywny, ponownie
wywoływana jest metoda
Public startApp() {}
Oczywiście rodzi to niebezpieczeństwo podwójnego alokowania pamięci podczas inicjacji
obiektów w tej metodzie. Trzeba więc albo inicjować obiekty w konstruktorze lub wprowadzić
inne metody zabezpieczeń przed dublowaniem się obiektów.
Zakończyć działanie MIDletu można za pomocą metody :
public void destroyApp(boolean) {}
Tutaj usuwanie są obiekty, ewentualne dane zapisywane są w pamięci trwałej.
MIDlet można również zakończyć wywołując metodę
notifyDestroyed()
Platforma nie wywołuje wówczas metody destroyApp().
Przyjmuje, iż aplikacja została już przygotowana do zamknięcia.
Katedra Informatyki Stosowanej
17
Przykłady
TextBox
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class app1 extends MIDlet {
public void startApp() {
TextBox tb = new TextBox("Tytuł", "Hello World", 80,
TextField.UNEDITABLE);
Display.getDisplay(this).setCurrent(tb);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Katedra Informatyki Stosowanej
18
Allert
Alert al = new Alert("Tytuł", "Treść informacji",
null, AlertType.INFO);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(this).
setCurrent(al);
Katedra Informatyki Stosowanej
19
Zamykanie Midlet-u przez komendę
startApp():
// tworzymy nowe polecenie
exitCommand = new Command("Zakończ",
Command.EXIT, 0);
// dodajemy polecenie do pola tekstowego
tb.addCommand(exitCommand);
// wskazujemy obiekt obslugujacy zdarzenia
tb.setCommandListener(this);
Display.getDisplay(this).setCurrent(tb);
Katedra Informatyki Stosowanej
20
destroyApp(boolean u):
// ciało metody z interfejsu CommandListener
public void commandAction(Command c,
Displayable d) {
// obsługa polecenia exitCommand
(kończy działanie aplikacji)
if (c == exitCommand) {
destroyApp(true);
notifyDestroyed();
Katedra Informatyki Stosowanej
21
Obsługa Gui – klasa Image
Katedra Informatyki Stosowanej
22
• public static Image createImage(String name)
Katedra Informatyki Stosowanej
23
•
•
•
•
•
•
•
•
•
•
startApp():
try {Image image =
Image.createImage("/pilka2.png");
Alert al = new Alert("Tytuł", "Treść
informacji",
image, AlertType.INFO);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(this).
setCurrent(al);}
catch (java.io.IOException e) {
e.printStackTrace();
Katedra Informatyki Stosowanej
24
Lista
startApp()throwsMIDletStateChangeException:
lista = new List("Lista", Choice.EXCLUSIVE);
lista.append("Opcja 1", null);
lista.append("Opcja 2", null);
lista.append("Opcja 3", null);
lista.setCommandListener(this);
lista.addCommand(new Command("Zakończ",
Command.EXIT, 0));
lista.addCommand(new Command("OK", Command.OK,
0));
Display.getDisplay(this).setCurrent(lista);
Katedra Informatyki Stosowanej
25
public void commandAction(Command c, Displayable d)
if (c.getCommandType() == Command.EXIT)
notifyDestroyed();
else if (c.getCommandType() == Command.OK)
{
Alert al = new Alert("Komunikat", "Wybrano opcję: " +
lista.getSelectedIndex(), null,
AlertType.CONFIRMATION);
al.setTimeout(Alert.FOREVER);
Display.getDisplay(this).setCurrent(al);
}
Katedra Informatyki Stosowanej
26
Katedra Informatyki Stosowanej
27
Formularze
Form m_Form = new Form("Formularz");
Item item;
item = new StringItem("Podaj swoje dane", "", 0);
item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
m_Form.append(item);
item = new TextField("Imię", "Twoje imię", 32, 0);
item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
m_Form.append(item);
item = new TextField("Nazwisko", "Twoje nazwisko", 32, 0);
item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
m_Form.append(item);
m_Form.setCommandListener(this);
m_Form.addCommand(new Command("OK", Command.OK, 0));
Display.getDisplay(this).setCurrent(m_Form);
Katedra Informatyki Stosowanej
28
Katedra Informatyki Stosowanej
29
try {
image = Image.createImage("/pilka2.png");
}
catch (java.io.IOException e) {
e.printStackTrace();
image = null;
}
m_Form.append(new StringItem(null, "Napis...", Item.PLAIN));
m_Form.append(new Spacer(32, 32));
m_Form.append(new ImageItem(null, image,
ImageItem.LAYOUT_DEFAULT, null));
m_Form.setCommandListener(this);
m_Form.addCommand(new Command("OK", Command.OK, 0));
Display.getDisplay(this).setCurrent(m_Form);
Katedra Informatyki Stosowanej
30
Katedra Informatyki Stosowanej
31
Pole daty
• import javax.microedition.lcdui.*;
• import javax.microedition.midlet.MIDlet;
• import java.util.TimeZone;
Katedra Informatyki Stosowanej
32
public class PoleDaty extends MIDlet{
private Form form;
private Display display;
private DateField dataRozp, dataKon;
private static final int DATE = 0;
public PoleDaty(){
dataRozp = new DateField("Data Rozp:", DateField.DATE,
TimeZone.getTimeZone("GMT"));
dataKon = new DateField("Data Końca:", DateField.DATE,
TimeZone.getTimeZone("GMT"));
Katedra Informatyki Stosowanej
33
public void startApp(){
display = Display.getDisplay(this);
Form form = new Form("Pole daty");
form.append(dataRozp);
form.append(dataKon);
display.setCurrent(form);
Katedra Informatyki Stosowanej
34
Przyciski wyboru pojedynczego oraz
komunikaty dźwiękowe
• import javax.microedition.midlet.*;
• import javax.microedition.lcdui.*;
•
• public class KomunikatDzwiekowy extends MIDlet implements
ItemStateListener, CommandListener{
•
•
•
•
•
private Display display;
private Form form;
private Command zakoncz;
private ChoiceGroup wybor;
Katedra Informatyki Stosowanej
35
public void startApp(){
display = Display.getDisplay(this);
wybor = new ChoiceGroup("Lista", Choice.EXCLUSIVE);
wybor.append("Komunikat", null);
wybor.append("Potwierdzenie", null);
wybor.append("Ostrzeżenie", null);
wybor.append("Alam", null);
wybor.append("Błąd", null);
zakoncz = new Command("Zakończ", Command.EXIT, 1);
form = new Form("");
form.append(wybor);
form.addCommand(zakoncz);
form.setCommandListener(this);
form.setItemStateListener(this);
display.setCurrent(form);
}
Katedra Informatyki Stosowanej
36
public void itemStateChanged(Item item)
switch (wybor.getSelectedIndex())
case 0:
AlertType.INFO.playSound(display);
break;
case 1:
AlertType.CONFIRMATION.playSound(display);
break;
case 2:
AlertType.WARNING.playSound(display);
break;
case 3:
AlertType.ALARM.playSound(display);
break;
case 4:
AlertType.ERROR.playSound(display);
Break;
Katedra Informatyki Stosowanej
37
Katedra Informatyki Stosowanej
38
Obsługa ekranu dotykowego Canvas
• repaint() <-> paint()
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Wskaznik extends MIDlet{
private Display display;
public void startApp(){
display = Display.getDisplay(this);
display.setCurrent (new MyCanvas());
}
public void pauseApp(){}
public void destroyApp (boolean forced){}
}
Katedra Informatyki Stosowanej
39
class MyCanvas extends Canvas {
//pole zmiennych
public MyCanvas() {
//konstruktor klasy
setFullScreenMode(true);
}
//obsługa zdarzeń
public void paint (Graphics g) {
//
}
}
Katedra Informatyki Stosowanej
40
Przykładowy wygląd metody paint()
public void paint (Graphics g) {
g.setGrayScale (255);
g.fillRect (0, 0, getWidth(), getHeight());
g.setGrayScale (0);
g.drawString (akcja + " " + x + "/" + y, 0, 0,
Graphics.TOP|Graphics.LEFT);
g.drawLine (x-4, y, x+4, y);
g.drawLine (x, y-4, x, y+4);
}
Katedra Informatyki Stosowanej
41
Przydatne metody obsługi zdarzeń
public void pointerPressed (int x, int y) {
akcja = "Naciśnięty";
this.x = x; this.y = y; repaint ();
}
public void pointerReleased (int x, int y) {
akcja = "Zwolniony";
this.x = x; this.y = y; repaint ();
}
public void pointerDragged (int x, int y) {
akcja = "Przenoszenie";
this.x = x; this.y = y; repaint ();
}
Katedra Informatyki Stosowanej
42
AWTEvent jest nadklasą różnych typów zdarzeń
generowanych przez elementy interfejsu graficznego:
● KeyEvent – generowany gdy otrzymane jest wejście
z klawiatury
● MouseEvent – generowany gdy mysz jest
przesuwana, klikana, naciskana, zwalniania, itp.
● ActionEvent – generowany gdy naciskany jest
przycisk, wybierany element menu, itp.
● TextEvent – generowany gdy zmienia się wartość
pola tekstowego
Katedra Informatyki Stosowanej
43
• KeyListener:
– void keyPressed(KeyEvent ke)
– void keyReleased(KeyEvent ke)
– void keyTyped(KeyEvent ke)
Katedra Informatyki Stosowanej
44
Obsługa zdarzeń klawiatury
KeyEvent jest generowany dla wejścia z klawiatury.
Trzy typy zdarzeń klawiatury:
• KEY_PRESSED – klawisz jest naciśnięty
• KEY_RELEASED – klawisz jest zwolniony
• KEY_TYPED – znak jest wygenerowany
Konstruktor zdarzenia klawiatury:
• KeyEvent(Component src, int type, long
when, int modifiers, int code, char ch)
Katedra Informatyki Stosowanej
45
Wirtualny kod klawisza:
• VK_ENTER VK_ESCAPE VK_CANCEL
• VK_UP VK_DOWN VK_LEFT
• VK_RIGHT VK_SHIFT VK_ALT
Metody klasy zdarzeń klawiatury:
• char getKeyChar()
• int getKeyCode()
CHAR_UNDEFINED gdy znak niedostępny.
VK_UNDEFINED gdy kod niedostępny.
Katedra Informatyki Stosowanej
46
• MouseEvent:
- MOUSE_CLICKED - kliknięcie
- MOUSE_DRAGGED - przeciąganie
- MOUSE_ENTERED – wejście do elementu
- MOUSE_EXITED – wyjście z elementu
- MOUSE_MOVED - przesuwanie
- MOUSE_PRESSED – naciskanie
- MOUSE_RELEASED - zwalnianie
Katedra Informatyki Stosowanej
47
Konstruktor zdarzeń myszy
MouseEvent(
Odwołanie do obiektu który wygenerował
zdarzenie:
• Component src,
Typ zdarzenia myszy:
• int type,
Czas systemowy kiedy zdarzenie zaszło:
• long when,
Katedra Informatyki Stosowanej
48
Które modyfikatory były wciśnięte:
• int modifiers,
Współrzędne myszy:
• int x, int y,
Liczba kliknięć:
• int clicks,
Czy zdarzenie spowodowało pojawienie się
menu?
• boolean triggersPopup)
Katedra Informatyki Stosowanej
49
uzyskanie współrzędnych myszy:
• int getX()
• int getY()
zmiana współrzędnych zdarzenia:
• void translatePoint(int x, int y)
ilość kliknięć:
• int getClickCount()
Katedra Informatyki Stosowanej
50
Katedra Informatyki Stosowanej
51

similar documents