J2ME v příkladech – lehký úvod

14. března 2003

V následující sérii článků si ukážeme, jak se píší aplikace pro mobilní telefony v mikroedici programovacího jazyku Java. Postupně projdeme všechny kroky, ve kterých si ukážeme jednotlivé části tvorby aplikace, a nakonec si vytvoříme vlastní aplikaci, takzvaný midlet.

O použití mikroedice Javy

V dnešní době je pro každého naprostou samozřejmostí mít mobilní telefon. Je to odvětví spotřební elektroniky které prochází nejrychlejším vývojem což nám, uživatelům, přináší mnohé klady.

Jedním z posledních hitů je použití programovacího jazyku Java v mobilních telefonech. Tato implementace otevírá celou řadu možností, jak rozšířit funkce mobilního telefonu podle potřeb jeho uživatele. Mobilní telefon se tak stává jakousi přenosnou, kapesní alternativou počítače. Samozřejmě nemá takové možnosti jako PC, ale jak ukazuje vývoj midletů, neboli aplikací pro mobilní zařízení (schválně nepíšu mobilní telefony, neboť využití J2ME je daleko širší, například v PDA), k mání je stále více aplikací napsaných v J2ME, které jsou odvozeny od „plnokrevných“ aplikací známých z PC.

J2ME neboli Java 2 Micro Edition je edice programovacího jazyku Java, určená k použití v mobilních zařízeních, která jsou omezena velikostí paměti, zobrazovací jednotky, možností síťové komunikace a zdrojem napájení. Vlastnosti a specifikace toho zařízení je shrnuta ve článku Co vás zajímá o J2ME, ale báli jste se zeptat.

V tomto seriálu se naučíme krok za krokem psát aplikace pro mobilní telefony (dále jen midlety) v J2ME. Každá kapitola bude zaměřena na jednu část aplikace, přičemž rozdělení jsem provedl tak, aby z částí, jež jsou obsahem jednotlivých kapitol, bylo možno po menších úpravách „poskládat“ funkční midlet.

Než začneme programovat

Před vlastní tvorbou midletu je vhodné si celý projekt rozvrhnout do několika vzájemně navazujících částí. Nejobecnější základní rozdělení běžného midletu je toto:

  • Splash screen neboli úvodní obrazovka. Obsahuje nejčastěji informace o aplikaci: název, verzi, copyright výrobce, kontakt na výrobce, homepage aplikace, údaje o autorských právech a vlastní logo aplikace.
  • Menu. Bývá často velmi podstatným pilířem aplikace, neboť jeho prostřednictvím ji uživatel ovládá. Menu se stává prostředkem komunikace mezi midletem a uživatelem a myslím, že není přehnané tvrzení, že menu midletu je rozhodující pro jeho použitelnost a oblíbenost. Aplikace, které má nepřehledné a nelogické menu, respektive celé ovládání, má podle mého názoru jen minimální šanci na úspěch v konkurenci ostatních. Ukážeme si několik způsobů jak menu vytvořit a jak ho efektivně používat ke komunikaci s uživatelem.
  • Engine vlastní aplikace. Je hlavním motorem celého midletu. Zpracovává uživatelská data, vytváří vlastní datové struktury, provádí výpočty, ukládá data do datového úložiště. Uživatel ji vlastně nevidí, jen vnímá její funkčnost, která by měla být stoprocentní a odolná vůči chybám, a to i ze strany uživatele.
  • Výstupní rozhraní aplikace. Slouží k předání výsledků běhu aplikace uživateli, ať už ve vizuální, akustické nebo kinetické formě. Česky řečeno, buď to bude něco kreslit nebo psát, pípat nebo vibrovat. Možností, jak vidíte, je dost na to, aby měl uživatel přehled o běhu aplikace.

Tak to bylo ve zkratce rozvrhnutí tvorby midletů na podstatné části. Je to velmi obecné, ale pro většinu projektů dostačující. A nyní už začneme s vlastní tvorbou.

Začínáme s midlety

Splash screen

Jedná se o úvodní obrazovku midletu. Při každém spuštění je splashscreen to první, co uživatel uvidí, proto si na něm dáme záležet, aby působil dobrým dojmem.

Nejprve si musíme ujasnit, pro jaký typ mobilního telefonu je náš midlet určen. Mobilní zařízení se totiž liší jak velikostí, tak typem zobrazovacích jednotek (display). Velikostí rozumíme počet zobrazitelných bodů v horizontálním a vertikálním směru. Minimum pro mobilní zařízení je 96 x 54 pixelů a barevná hloubka 1 bit.

Typ nám pak říká, jakou barevnou hloubku umí daný displej zpracovat. V praxi rozeznáváme tři druhy, první je černobílý displej, který umí jen dvě barvy. O něco větší možnosti, co se týče zobrazování, mají displeje, které umí zobrazit několik stupňů šedé barvy. Třetí a poslední typ je displej barevný, zde se barevná hloubka pohybuje od 256 barev až po (zatím) 4096 barev, ale s postupem vývoje to bude stále víc.

V tomto příkladu budeme vytvářet splashscreen pro mobilní telefon, který je částí Wireless Toolkitu od firmy Sun. O použití se můžete dočíst v článku J2ME v kostce – první midlet.

Pro naše pokusy využijeme emulátor mobilního telefonu „Motorola i85s“, který umí zobrazit 105 x 78 pixelů v jednobitové barevné hloubce, čili černobíle. Nejprve si vytvoříme obrázek, který bude tvořit splashscreen. K tomuto účelu nám velmi dobře poslouží jakýkoli kreslící program, nejčastěji asi sáhneme po programu „Malování“. Po spuštění programu nejprve nastavíme velikost obrázku tak, aby odpovídala velikosti displeje, atributy obrázku nastavíme na černobílý. Pak už jen zbývá si obrázek opticky zvětšit, aby se nám kreslilo pohodlněji, a můžeme začít. Výsledný soubor stačí zkonvertovat do typu *.png (Portable Network Graphics), se kterým umí J2ME pracovat.

Pro ty, kteří nechtějí ztrácet čas tvorbou obrázku, jsem připravil malý příklad:

Splash screen - první midlet
Splash screen, 105 x 78 pixelů, 1bitová hloubka, formát PNG.

Jak to bude vypadat v praxi.

Spustíme Wireless Toolkit, založíme nový projekt, pojmenujeme ho například Abc. Vytvoříme soubor Abc.java a uložíme do něj následující kód:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Abc extends MIDlet implements CommandListener {
  Display disp;
  Command konec;
  Canvas can;
  // v konstruktoru třídy vytvoříme tlačítko pro ukončení aplikace
  public Abc() {
    konec = new Command(„Konec“, 1, Command.SCREEN);
  }
  public void startApp() {
    //
    disp = Display.getDisplay(this);
    // vytvoříme novou instanci třídy Splash, která je definována v souboru Splash.java
    can = new Splash();
    // umístíme na obrazovku tlačítko pro ukončení aplikace
    can.addCommand(konec);
    // nastavíme obrazovku jako „posluchače“ události která nastane při stisku tlačítka
    can.setCommandListener(this);
    // a umístíme plátno na aktuální displej
    disp.setCurrent(can);
  }
  public void pauseApp() {
    // zde necháme prázdnou metodu neboť ji nepoužijeme
  }
  public void destroyApp(boolean unconditional) {
    // aplikace informuje manažer aplikací aby ji ukončil a uvolnil zdroje které obsadila
    notifyDestroyed();
  }
  public void commandAction(Command c, Displayable d) {
    String popis = c.getLabel();
    if(popis.equals(„Konec“)) { destroyApp(true); }
  }
}

Tento zdrojový kód vytvoří midlet, který bude obsahovat jen splashscreen a tlačítko pro ukončení aplikace. Vlastní zobrazení obrázku má na starosti třída Splash, která je uložena v souboru Splash.java a obsahuje následující kód:

import javax.microedition.lcdui.*;
// definice nové třídy, potomka třídy Canvas
public class Splash extends Canvas {
  Image ii;
  // v konstruktoru třídy vytvoříme obrázek
  public Splash() {
  try {
      // použijeme metodu createImage třídy Image
      ii = Image.createImage(„/splash.png“);
      // odchycení možné výjimky
      } catch(Exception e) {
      }
  }
  public void paint(Graphics g) {
    // nejprve nastavíme barvu kreslení na bílou a vyplníme display obdélníkem o maximální šířce a výšce
    g.setColor(255, 255, 255);
    g.fillRect(0, 0, getWidth(), getHeight());
    // vykreslíme obrázek umístěný do levého horního konce displeje
    g.drawImage(ii, 0, 0, g.TOP|g.LEFT);
  }
}

Oba soubory Abc.java a Splash.java uložíme do adresáře „/src“ našeho projektu a obrázek splash.png uložíme do adresáře „/res“. Pak projekt otevřeme v programu Wireless Toolkit, tlačítkem Build převedeme do takzvaného bytecodu, z nabídky Device zvolíme zařízení Motorola i85s a spustíme stiskem tlačítka Run.

Objeví se nám nové okno s obrázkem mobilního telefonu Motorola i85s který je zároveň jeho emulátorem. V nabídce uvidíme ve výběru náš midlet, potvrdíme tedy tlačítkem launch jeho spuštění, načež se nám objeví náš první splashscreen:

Náš první midlet v emulátoru
Midlet v emulátoru telefonu Motorola i85s.

Co když neznáme velikost displeje?

Pokud tvoříte úvodní obrazovku pro jiný mobilní telefon, u něhož neznáte počet zobrazitelných pixelů, lze to zjistit jednoduchým způsobem. Stačí do souboru Splash.java uložit následující kód:

import javax.microedition.lcdui.*;
public class Splash extends Canvas {
  public Splash() {
  }
  public void paint(Graphics g) {
   g.setColor(255, 255, 255);
   g.fillRect(0, 0, getWidth(), getHeight());
   g.setColor(0, 0, 0);
   g.drawString(„X “ + getWidth() + “ Y “ + getHeight(), 0, 0, g.TOP|g.LEFT);
  }
}

Pak už zbývá jen vytvořit JAD a JAR soubor, nahrát do mobilního telefonu a spustit. Příklad vypíše po spuštění na display počet zobrazitelných pixelů:

Test velikosti displaye - Siemens C55
Midlet zobrazující velikost displeje na telefonu Siemens C55.

Použití třídy javax.microedition.lcdui.Canvas však nemusí vždy znamenat použití celého displeje telefonu. Výjimku z tohoto pravidla tvoří implementace Javy v mobilních telefonech Nokia, kde je nutno použít třídu com.nokia.mid.ui.FullCanvas.

Použijeme opět třídu Abc, kterou lehce upravíme. Jelikož třída FullCanvas neumožňuje použití rozhraní CommandListener, je nutno toto vypustit:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Abc extends MIDlet {
  
  Display disp;
  Canvas can;
  public Abc() {
  }
  public void startApp() {
    //
    disp = Display.getDisplay(this);
    // vytvoříme novou instanci třídy Splash, která je definována v souboru Splash.java
    can = new Splash();
    // a umístíme plátno na aktuální display
    disp.setCurrent(can);
  }
  public void pauseApp() {
    // zde necháme prázdnou metodu neboť jí nepoužijeme
  }
  public void destroyApp(boolean unconditional) {
    // aplikace informuje manažer aplikací aby ji ukončil a uvolnil zdroje které obsadila
    notifyDestroyed();
  }
}

Změny provedeme také v souboru Splash, kde použijeme třídu FullCanvas z balíčku com.nokia.mid.ui, který je přístupný jen v zařízeních od této firmy. Třída Splash.java bude vypadat následovně:

// importujeme třídu FullCanvas z balíčku výrobce
import com.nokia.mid.ui.FullCanvas;
import javax.microedition.lcdui.*;
// a uděláme svojí vlastní která je jejím potomkem čili dědí její metody a vlastnosti
public class Splash extends FullCanvas {
  public Splash() {
  }
// zbytek už zůstává stejný
  public void paint(Graphics g) {
   g.setColor(255, 255, 255);
   g.fillRect(0, 0, getWidth(), getHeight());
   g.setColor(0, 0, 0);
   g.drawString(„X “ + getWidth() + “ Y “ + getHeight(), 0, 0, g.TOP|g.LEFT);
  }
}

Soubory uložíme, převedeme do bytecodu, vytvoříme z nich JAD a JAR soubory a spustíme v mobilním telefonu Nokia. Na obrázcích můžete vidět rozdíl mezi použitím třídy Canvas z balíčku javax.microedition.lcdui a FullCanvas z balíčku com.nokia.mid.ui.

Nokia 7210, použití třídy Canvas
Nokia 7210 při použití třídy Canvas.

Jak vidíte, midlet v horní části displeje zobrazuje název midletu, čímž omezil zobrazovací schopnosti o 32 pixelů. Následující obrázek ukazuje vykreslování na celý displej:

Nokia 7210, použití třídy FullCanvas
Nokia 7210 a třída FullCanvas, rozdíl je naprosto zřejmý.

Tato třída sice umožní vykreslovat na celý displej na mobilních telefonech Nokia, bohužel její použití nás omezuje v implementaci interface CommandListener, ale o tom až příště.

Užitečné zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Emil

    Úno 27, 2011 v 1:23

    Dobrý den,měl bych na vás dotaz.Chtěl bych se naučit udělat nějaký prográmek v Jave pro telefon.Nainstaloval jsem si tedy Wireless Toolkit.Jak píšete založil jsem nový projekt,chce to ještě Midlet Class Name,nevím co tam napsat,pak píšete že vytvoříme soubor Abc.java,ale jak,nebo v čem ho mám vytvořit a jak do něj vložit následující kod?Potřeboval bych to asi více „polopatě“vysvětlit.Pokud byste mi mohli poradit,budu rád.Předem děkuji za odpověd.Programování mě baví,už jsem zvládl Delphi,procesory PIC,Basic i Amigu,ale v tomhle tápu.

    Odpovědět

Napsat komentář: Emil Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *