J2ME
Java 2 Micro Edition David Stach Ondřej Dušek
Historie – počátky Java ME a Javy vůbec
1990 v Sun Microsystem návrh na vytvoření jazyka, použitelného pro domácí spotřebiče
1992 jazyk Oak (dub) 1995 zjištění, že název Oak již používá jiný jazyk – název Java 1996 vydán JDK 1.0 2000 Java ME – Java se vrátila k původnímu záměru
2
Výskyt a využití J2ME Mobilní
telefony (největší skupina)
PDA Pagery Výherní
a prodejní automaty Set-Top box
3
Proč zrovna Java
Bezpečnost
Kontrolovatelnost Nezávislost (JVM, KVM) Mezinárodní znaková sada (Unicode) Vlákna Konkurenti, kteří neuspěli – Mophun, ExEn(InFusio)
4
Vlastnosti a neúspěch platformy Mophun
Programování pomocí C/C++ s využitím SDK, které je na žádost zdarma
Aplikaci je potřeba certifikovat – neexistence freeware her
Vlastnosti a neúspěch platformy ExEn Programování pomocí Java – standardizace Podpora malého množství výrobců, malá podpora od operátorů Standardizace Javy 5
Konfigurace J2ME
Definice programového vybavení pro určité skupiny zařízení. Rozlišení podle typu a velikosti paměti, typu a rychlosti procesoru a síťového připojení Konfigurace zahrnuje virtuální stroj, knihovny, třídy a API funkce. Rozlišují se dvě J2ME konfigurace: CDC (Connected Device Configuration )
CDC 1.0 , CDC 1.1.2
CLDC (Connected Limited Device Configuration )
CLDC 1.0 , CLDC 1.1 6
CDC
Plná podpora Java Virtual Machine API odvozeno z J2SE 1.3 zahrnuje celou CLDC 1.0 Zařízení s větším paměťovým prostrem (více než 2MB) 32 bitový procesor Síťové připojení Java Native Interface, serializace Využití v TV s internetem, Set-top box, herní konzole… 7
Profily konfigurace CDC
Foundation Profile
Personal Basis Profile
Personal Profile
8
CLDC (Connected Limited Device Configuration)
Nejmenší definovaná konfigurace Javy Využití zejména v mobilních zařízeních s omezenými zdroji (mobilní telefony, komunikátory, PDA, pagery…) Zařízení s paměťovým prostorem 160-512 kB, 16 bitový procesor s minimální frekvencí 16 MHz Obsahuje jen ořezanou JVM – tzv. KVM Požadavky: 128kB ROM pro JVM, 32kB paměti nezávisle na jiných aplikacích
9
CLDC implementace
Dvě rozdílné implementace
CLDC reference implementation (RI)
Ukázka jak může být CLDC specifikace implementována (vzor od SUNu)
CLDC HotSpot Implementation Implementace přímo od SUNu, efektivní, patentovaná vylepšení komerční
10
Profily CLDC
PDAP – speciálně pro požadavky zařízení PDA
MIDP – profil pro mobilní telefony, je nejrozšířenější a nejpoužívanější
IMP - Information Module Profile – pro prodejní automaty apod. , odstraněno grafické rozhraní(LCDUI ) z MIDP1.0
11
MIDP 1.0 (Mobile Information Device Profile)
Charakteristika zařízení s podporou MIDP:
paměť použitelná pro prostředky Javy přibližně 512K (ROM + RAM),
omezený výkon procesoru,
omezený zdroj energie, typicky baterie,
omezený prostor pro ukládání dat, připojení k bezdrátové síti (většinou s omezenou šířkou pásma),
různorodost uživatelského interface, omezené ovládání (vstupní zařízení),
malý display s nízkou hloubkou barev. 12
MIDP 2.0
Zpětná kompatibilita s 1.0, přidává nové třídy
Novinky:
Podpora HTTPS (Generic Connection Framework)
Multimédia - vlastní Media API pro práci s multimedii, podmnožina Mobile Media API(MMAPI), zahrnuje jen audio Rozšíření javax.microedition.lcdui – lepší práce s Form a Item … Game API - javax.microedition.lcdui.game – možnot vykreslit hru přes celý display, snížení kódu aplikace
Práce s RGB obrázky Ověřování důvěryhodnosti MIDletu
Sdílené úložiště dat mezi MIDlety – na rozdíl od MIDP 1.0 může jedna aplikace číst RMS jiné 13
MIDP 3.0
Nyní ještě ve vývoji
Měl by přinést především věci, co chybí v MIDP 2.0 ale jsou hojně využívány buď pomocí API výrobců, nebo pomocí balíčků
podpora více spuštěných midletů současně
běh midletu na pozadí (s MIDP 2.0 je midlet možné pouze zapauzovat) možnost automatického spuštění (například po zapnutí telefonu) vylepšena podpora velkých displejů, možnost využívat i druhý displej
zlepšena přímá podpora mobilních her
spolupráce mobilní javy s jinými funkcemi telefonu jako například MMS, paměťová média...
14
Volitelné balíčky (packages)
Jak pro CDC tak pro CLDC Rozšiřují základní nabídku funkcí Výrobci je nejsou povinni implementovat Používají se pro specifické účely (hry, webové služby, multimedia…)
15
Volitelné balíčky
APIs for Bluetooth
Wireless Messaging API (WMA)
Short Message Service (SMS)
Cell Broadcast Service (CBS)
Mobile Media API (MMAPI)
Audio, video, přístup k multimediálním zařízením (foťák, mikrofon)
16
Volitelné balíčky
PDA Optional Packages Personal Information Management (PIM) –přístup k vestavěným aplikacím (kalendář, adresář, telefonní seznam…) FileConnection (FC) – přístup k FileSystemu především kvůli paměťovým kartám
Mobile 3D Graphics – především pro 3D hry, animované zprávy, screen savery…
17
Volitelné balíčky
18
IMP
Využíváno pro zařízení bez displeje (prodejní automaty, výherní automaty…)
IMP 1.0 – základem je MIDP1.0 ořezaný o grafické rozhraní LCDUI
IMP-NG – IMP next generation, odvozena od MIDP2.0
Zahrnuje bezpečnostní a síťová rozšíření, ale opět bez UI API a game API 19
Vlastní API výrobců
Především v době MIDP 1.0
Implementace zvuků
grafické rozhraní pro hry
Ani MIDP 2.0 však nemá vše
Podpora přístupu do filesystemu
Přístup k telefonnímu seznamu
Odesílání SMS zpráv Přístup k fotoaparátu
Ač by měla být Java přenositelná a vylepšení od výrobců toto kazí, API jsou často nezbytná 20
Siemens API
com.siemens.mp.game
com.siemens.mp.gsm
umožňuje přehrát multimediálnií soubory (WMA, MPG)
com.siemens.mp.media.control
přístup aplikace do vlastního adresáře a v něm využití filesystemu, posílání dat pomocí IrDA
com.siemens.mp.media
čtení SMS, volání, prohlížení seznamu telefonu…
com.siemens.mp.io
vibrace, podsvícení, pokročilá grafika, práce se zvuky
nastavení hlasitosti
com.siemens.mp.ui
pokročilá práce s obrázky
21
Nokia API
com.nokia.mid.ui
Vibrace, podsvětlení, Full Canvas, rozšíření práce s obrázky
com.nokia.mid.sound
Přehrává více zvuků najednou
Podpora WAV a RTPL (ringing tone programming language)
22
Motorola API
com.motorola.game
com.mot.tcc.media
FullCanvas, práce s obrázky, zvuk na pozadí (pouze jeden), ostatní zvuky
ovládání media playeru, vibrací, podsvícení
com.motorola.messaging
správa a odesílání SMS
23
3D API pro J2ME
Mascot Capsule Micro 3D version 3
Různá implementace od výrobců
Velice omezená Používá jen celá čísla
Vývoj již dále nepokračuje
Mobile 3D Graphics (M3G) Standardizovaná - JSR-184(M3G API) Široký záběr
Předběhla HW telefonů
Očekává se masové nasazení 24
Podporované formáty souborů
Norma vs. Praxe
Obrázky PNG-8 / GIF, JPEG, BMP
Zvuky MIDP 1.0 bez podpory Wav(8-bit, 8 KHz)/ MIDI, generátor tónů, AMR, MP3, MMF, iMelody různé pro různé výrobce a modely
Textové soubory UTF-8
25
Soubory JAD a JAR
JAR (Java Archive)
uloženy všechny třídy, obrázky a další soubory pro běh aplikace
potřebné informace (název aplikace, jméno autora, číslo verze, atributy …)
JAD (Java Application Descriptor)
Textový soubor
Obsahuje informace o aplikaci (obvykle stejné)
Formát: „atribut: hodnota“ hodnota“
26
MIDlet
1 mobilní aplikace (v 1 JARu může být víc – 'Midlet Suite') hl. třída – spustitelná – odvozená od javax.microedition.midlet
aplikační manažer – stavy 'active', 'paused', 'destroyed' - zprostředkovává rozhraní mezi aplikací a runtime prostředím Fyzicky se skládá ze souborů JAD a JAR - nutný popis vlastností MIDletu v manifestu JARu a JAD Není možný běh více aplikací najednou Jedna aplikace nemůže spustit jinou 27
třída MIDlet public class MyMidlet extends MIDlet { public void startApp(){ } public void pauseApp(){ } public void destroyApp( boolean unconditional ){ } }
28
třída MIDlet
startApp()
pauseApp()
volána kdykoliv při přechodu do 'active' přechod do 'paused' – na pozadí
destroyApp()
před ukončením (skončit nemusí)
pro úplné ukončení ('destroyed'): notifyDestroyed()
29
třída Display
manažer obrazovky/vstupních zařízení, singleton
zobrazitelné věci: Displayable
static Display getDisplay( MIDlet m )
získání instance
Displayable getCurrent()
(potomci: Screen, Canvas - 'high/low level' UI)
aktuální 'obrazovka'
void setCurrent( Displayable next ) void setCurrent( Alert a, Displayable next )
nastavení další obrazovky / výstrahy a obrazovky
30
třída Display
void callSerially( Runnable r )
void setCurrentItem( Item item )
jako current nastaví obrazovku obsahující item a odscrolluje na něj
int numColors(), int numAlphaLevels()
zavolá runnable po překreslení obrazovky
vrací počet barev / úrovní průhlednosti
další – vibrace, barevné schéma atd. (část. MIDP 2.0)
31
třída Displayable
int getWidth(), int getHeight(), String getTitle()
boolean isShown()
rozměry, titulek je právě na obrazovce?
void void void
addCommand( Command cmd ) removeCommand( Command cmd ) setCommandListener( CommandListener cl )
příkazy, vyvolané obvykle stisknutím softkeys telefonu
32
třída Screen
abstract
předek všech high-level UI-tříd: Alert, List, TextBox, Form
nemá žádné metody navíc proti Displayable
třída Alert zobrazování výstrah Alert( String title, String text, Image alertImg, AlertType alertType ) Alert( String title ) int getTimeout(), void setTimeout( int to ) static int FOREVER static Command DISMISS_COMMAND 33
třída List
select box
List( String title, int type, String [] elems, Image [] imgElems )
type
– IMPLICIT,
EXCLUSIVE, MULTIPLE ...
třída TextBox text box – scrollující – omezený max. velikostí TextBox( String title, String text, int maxSize, int constraints ) constraints – ANY, EMAILADDR, NUMERIC ... 34
třída Form
obs. více elementů různých typů(potomků tř. Item)
v pořadí od 0, 1 element v max. 1 Form-u
vertikálně scrollující (rozložení - Item.setLayout() )
Form( String title ) Form( String title, Item [] elemens ) append( Image i ), append( Item i ), append( String s ) insert( Item i, Item priorTo ) Item get( int order ), void set( int order, Item i ) delete( int order )
35
třída Form
změna elementu formuláře – ItemStateListener
(1 metoda itemStateChanged )
Možné elementy:
ChoiceGroup ( = List ) CustomItem (abstract) DateField Gauge (ukazatel hodnoty) ImageItem Spacer (výplň s min. velikostí) StringItem TextField ( = TextBox )
36
třída Canvas
low-level UI – přímé kreslení na obrazovku
public class MyCanvas extends Canvas { protected void paint( Graphics g ){ ... } protected void keyPressed( int keyCode ){ ... } }
paint – abstract
keyCode – nadefinované konstanty; getGameAction 37
třída Canvas
další 'notifikace':
void void void void void void void void
keyRepeated( int keyCode ) keyReleased( int keyCode ) pointerPressed( int x, int y ) pointerDragged( int x, int y ) pointerReleased( int x, int y ) showNotify() hideNotify() sizeChanged()
celá obrazovka: setFullScreenMode( boolean fs )
(default: false) -- jen MIDP 2.0 38
třída Canvas - paint
void paint( Graphics g )
dostanu grafický kontext obrazovky, volám jeho metody
drawLine, drawRect, fillRect, drawImage, setColor drawString, drawChar(s), setFont getDisplayColor
konstanty TOP, LEFT, VCENTER, BOTTOM ... kreslení jen do části obrazovky: setClip, getClip,
translate
překreslení: void repaint()
vynucené překreslení: void serviceRepaints() 39
třída Image
obrázek z ext. souboru nebo prostor pro kreslení
static Image.createImage()
z Image, byte [], String
'mutable'/'immutable': boolean isMutable()
kreslení – Graphics getGraphics() - jen pro 'mutable' PNG povinně podporované
Alpha – jen 'immutable', Display.numAlphaLevels()
40
třída Command interface CommandListener
příkazy pro soft-keys (přidávají se k Canvas nebo Screen )
Command( String label, int type, int priority )
type – BACK, CANCEL, EXIT, OK, SCREEN ... Displayable & potomci:
addCommand( Command cmd ) removeCommand( Command cmd ) setCommandListener( CommandListener cl )
interface CommandListener – 1 metoda: void commandAction( Command cmd, Displayable d )
41
interface Runnable
1 metoda: void run() vytvoření threadu Thread t = new Thread( new Runnable(){ public void run(){ System.out.printLine( "Hello" ); } } ); t.start(); 42
RMS (Record Management System)
import javax.microedition.rms.*;
Databáze uchovávaná ve filesystému přístroje, jediná možnost uchování uživ. dat
unikátní názvy v rámci Midlet Suite zajištěna atomicita operací, persistence dat
při odstranění MIDletu se odstraní i databáze
od MIDP 2.0 může MIDlet používat i cizí databáze
databáze zůstává i po upgrade programu
v databázi lze také třídit a filtrovat
export z databáze a její zálohování není možné 43
třída RecordStore
otevření: static RecordStore openRecordStore( String name, boolean createIfNecessary )
operace: int addRecord( byte[] data, int off, int len ) byte [] getRecord( int id )
mazání: deleteRecord(int id)
mazání celé databáze: deleteRecordStore(String name)
informace o databázi: int int int
getNumRecords() getSize() getSizeAvailable() 44
ukázka vkládání do databáze
String jmeno = "Jan Nová Novák"; k"; "777111222"; ; String cislo = "777111222"
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(buffer); RecordStore store = null; null; try { store = RecordStore.openRecordStore("tel_seznam", true); true); // otevř otevření ení dos.writeUTF(jmeno); //vlož //vložení ení jmé jména do ostreamu dos.writeUTF(cislo); //vlož //vložení ení čísla do ostreamu byte[] byte[] bytes = buffer.toByteArray(); // př převod ByteArrayOutputStream // na pole bytů bytů store.addRecord(bytes, 0, bytes.length); // vlož vložení ení záznamu do databá databáze } catch (Exception e) { e.printStackTrace(); } finally { try { store.closeRecordStore(); //zavř //zavření ení databá databáze i ostreamu dos.close(); } catch (Exception e2) { e2.printStackTrace(); } } byte[] byte[] bytes = store.getRecord(i); DataInputStream dis = new DataInputStream(new DataInputStream(new ByteArrayInputStream(bytes)); String jmeno = dis.readUTF(); String cislo = dis.readUTF();
45
třída Manager/Player
import javax.microedition.media.*;
přehrávání hudby/videa ( MMAPI, MIDP 2.0)
podpora formátů různá, MIDI většinou ano
Manager (static): createPlayer( InputStream s, String contentType ) createPlayer( String url ) String [] supportedContentTypes(String protocols) String [] supportedProtocols(String contentTypes) void playTone(int note, int duration, int volume) Player (interface): start(), stop(), prefetch(), deallocate() PlayerListener, MediaException
46
interface HttpConnection
import javax.microedition.io.*;
MIDP 1.0 – jediné síť. spojení, MIDP 2.0 - i HTTPS a další (sítě nemusí podporovat)
spojení vytvářeno Connector.open( String url )
nastavení spojení: setRequestMethod( String key ), setRequestProperty( String key, String value )
po připojení:
long getLength(), String getType(), int getResponseCode() InputStream openInputStream(), InputStream openOutputStream()
zavření: close() 47
potřebné nástroje
JDK (javac)
http://java.sun.com/javase/downloads/index.jsp
Java Wireless Toolkit for CLDC
http://java.sun.com/javame/downloads/index.jsp
ktoolbar.exe jde i ručně (classpath k JAR-ům s API), nepohodlné
IDE – 'mobile plugins'
NetBeans: http://www.netbeans.org/products/mobility/
Eclipse: http://eclipseme.org/
emulátory jednotl. výrobců (různě spolehlivé)
48
emulátory
Nokia: http://forum.nokia.com
'prototype' SDK
SDK pro jednotl. platformy (S40, S60, S80) v. 1-3, další pro specifické přístroje
tech. specifikace všech přístrojů – podporovaná API atd.
SonyEricsson http://developer.sonyericsson.com/ SE SDK for Java ME – pro většinu přístrojů (obs. 2 platformy podle podporovaných API), add-ony specifikace telefonů (PDF), návody
49
emulátory
Samsung http://developer.samsungmobile.com/
emulátory pro některé přístroje, nepříliš spolehlivé
popisy podporovaných API všech telefonů
Benq/Siemens http://developer.benqmobile.com/
SDK, add-ony pro nové telefony
Motorola http://developer.motorola.com/?path=1.2
SDK – různé verze pro telefony bez/s OS
popisy zařízení – API
většinou nutná bezplatná registrace
50
přenesení aplikace do telefonu
IR/Bluetooth
kabel
spec. software
WAP
přítomnost rozhraní rozhodně nezaručuje schopnost přijmout aplikaci
nejpomalejší, nejpracnější, často jediná možnost
on-device debugging
51
poznámky
použití obfuskátoru
ProGuard http://proguard.sourceforge.net/
zmenšení velikosti aplikace, ochrana
komprese médií, komprese JARu zmenšení PNG – pngcrush, pngout komprese zvuků
ne-OOP postupy
méně tříd, co nejmíň vnitřních tříd, krátký classpath
odstranění 'zbytečných' metod
52
odkazy
http://java.sun.com/javame/
MIDP 2.0 specifikace http://java.sun.com/javame/reference/apis/jsr118/
články o J2ME http://interval.cz/vyvojhttp://interval.cz/vyvoj-aplikaci/j2me/
diskuzní fóra http://www.j2meforums.com/forum/ http://www.j2meforum.com/ (německy) http://discussion.forum.nokia.com/forum/index.php
(diskuzní fóra ostatních výrobců)
53