Programmierung von Mobiltelefonen mit Java Carsten Köhn Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Symbian OS / Java history Symbian OS Version 5.0 <=> JDK 1.1.4 basierende Implementierung Symbian OS Version 6.0 <=> Personal Java Ab Symbian OS Version 7.0 <=> Java 2 Micro Edition (J2ME) Die neuste Generation der Symbian OS Telefone unterstützt MIDP 2.0 und eine Auswahl an zusätzlichen Java-konformen APIs Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 1 User Interface bei Symbian OS Derzeit wird bei Symbian OS zwischen drei User Interfaces unterschieden Mobiltelefone mit einem numerischen Keypad Series 60 Platform Einhand Betrieb Flexible UI für Joystick, Softkey, Jogdail Basiert auf Nokia 7650, 3650, N-Gage Series 60 ebenfalls lizensiert für Panasonic, Samsung, Sendo and Siemens Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Die Handys Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 2 User Interface 2 Mobiltelefone mit touch screen UIQ Größere Displays als Series 60 Telefone Dadurch bessere Navigation bei pen-based interaktionen Modellbeispiel: Sony Ericsson P800 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Mobiltelefon mit Touchscreen Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 3 User Interface 3 Mobiltelefone mit vollen Keyboard Series 80 Plattform Größter Display von allen Symbian OS Telefonen Ebenfalls mit touch screen Modellbeispiel: Nokia 92xx Series, 9500 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 9x Handys Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 4 Programmbeispiel Hello World #include <e32base.h> #include <e32cons.h> LOCAL_D CConsoleBase* gConsole; //Real main function void MainL() { gConsole->Printf(_L("Hello world!\n")); } //Console harness void ConsoleMainL { // Get a console gConsole = Console::NewL(_L("Hello Text"), Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Programm Hello World // Pause before terminating User::After(5000000); // % second delay // Finished with console CleanupStack::PopAndDestroy(gConsole); } // Cleanup stack harness GLDEF_C TInt E32Main() { __UHEAP_Mark; CTrapCleanup* cleanupStack = CTrapCleanup::New(); TRAPD(error, ConsoleMainL()); __ASSERT_ALWAYS(!error, User::Panic(_L("SCMP"), error)); delete cleanupStack; __UHEAP_MARKEND; return 0; } Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 5 Beschreibung zu dem Programm Die Hauptarbeit wird in der ersten Befehlszeile programmiert //Real main function void MainL() { gConsole->Printf(_L("Hello world!\n")); } Aus dem printf() das in C zur Textausgabe genutzt wird ist hier Console->Printf Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Gründe für Java Ausgereifte Laufzeitumgebung Weite Verbreitung der Programmiersprache Objektorientierter Programmieransatz Sicherheit Definierte Schnittstellen Ursprünglich ist Java für mobile Endgeräte bzw. Thin clients entwickelt worden Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 6 J2ME Neues und kleinstes Mitglied der Java Familie Teil der Java Architektur um für, von der Leistung her eingeschränkte Geräte, wie z.B. Mobiltelefone zu programmieren. Gruppierung nach so genannten „configurations“ und noch einen Schritt weiter in verschiedene „profiles“ unterteilt, welche die Java API´s weiter verfeinern. Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK J2ME Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 7 Java Progammversionen J2EE – Java 2 Enterprise Edition Server-Lösungen Erweiterte Standard Edition für Unternehmensanwendungen Applikationsserver Enterprise Java Beans J2SE – Java 2 Standard Edition Desktop-Lösungen Applets und Desktopanwendungen Standard API Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK J2ME – Java 2 Micro Edition Java Microsystems bietet (momentan) zwei Geräteklassen (Configurations) CDC – Connected Device Configuration High-end Consumer Devices Pocket PCs, set-top-Boxen, Bildschirmtelefone, Autoinfotainment-Systeme Farbdisplays, TCP/IP-Übertragung, >1MB Speicher CLDC – Connected Limited Device Configuation Mobiltelefone, Pager, Organizer, … SW-Display, Speicher bis 512KB, … Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 8 configurations Eine Konfiguration besteht aus der Kombination einer Virtual Machine mit einem minimalen Set von Klassen Bibliotheken, die die Basisfunktionalität einer Gerätegruppe liefern. (z.B. Speicherverwaltung oder Prozessorleistung) Während eine configuration den kleinsten gemeinsamen Nenner für eine Gerätegruppe liefert, setzt das profile auf ihr auf, um die API´s für bestimmte Geräteklassen bereitzustellen. Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK CDC – Connected Device Configuration PDAs, set-top Boxen, Smartphones Keine Einschränkung zur Standard JVM Reduzierter Speicherbedarf und optimierte virtuelle Maschine (CVM) Anforderungen: 32 Bit Prozessor vollständiges OS mind. 2 MB Speicher 512 KB Java Umgebung 256 KB Laufzeit Umgebung Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 9 CDC – Profile Profile setzen auf den Configurations auf und erweitern die zur Verfügung stehende API Foundation Profil Basis für weitere Profile der CDC RMI Profil noch nicht abschließend spezifiziert. „Remote Method Invocation“ Personal Profil integriert Personal Java in die CDC, z.B. GUI Funktionalität Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Struktur der J2ME (CDC) J2ME Profil Ebene (Personal Profile) Configuration Ebene (CDC) C Virtual Machine Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 10 CLDC – Connected Limited Device Configuration definiert über den JSR30 [http://jcp.org/en/jsr/detail?id=30] für Geräte mit den folgenden Eigenschaften 160 KB bis 512 KB Speicher für die Java Plattform vorhanden 16-bit oder 32-bit Prozessor niedriger Stromverbrauch | meist über Akku temporäre Netzwerkverbindung, möglicherweise wireless und mit max. 9600 160KB Mindestanforderung = 128KB nicht flüchtiger Speicher für die JVM und die CLDC-Bibliotheken + 32KB flüchtiger S. als Java runtime object memory Aufwärtskompatibel zur CDC Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK CLDC – Profile Mobile Information Device Profil (MIDP) Methoden zur Ansteuerung kleiner Displays Framework zur Ausführung so genannter MIDlets Java API for Bluetooth vollständig spezifiziert PDA Profil unvollständig spezifiziert Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 11 Struktur der J2ME (CLCD) J2ME Profil Ebene (MIDP) Configuration Ebene (CLDC) K (Kauai oder Kilo) Virtual Machine Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK MIDP ermöglicht das Ausführen mehrerer MIDP Anwendungen (so genannte MIDlets ) definiert: wie das MIDlet gepackt ist was für eine Laufzeitumgebung zur Verfügung steht wie es sich in Bezug auf die oft limitierten Ressourcen verhalten soll MIDlet´s können zu so genannten Suites zusammengefasst werden, um Ressourcen zu teilen jede MIDlet Suite hat eine beschreibende Datei, welche es der Application Management Software (AMS) erlaubt vor der Installation zu wissen was installiert wird jedes MIDlet beerbt die Klasse MIDlet in javax.microedition.midlet Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 12 Core Libraries Einige Klassen wurden von J2SE geerbt. Hier gilt: Klassen müssen gleich heißen Pakete müssen gleich heißen oder Subsets der entsprechenden Pakete sein die Semantik der Klassen muss gleich bleiben MIDP: >erbt folgende Klassen via CLDC von J2SE: java.lang java.io java.util und stellt weitere Klassen in javax.microedition und Unterpaketen zur Verfügung Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Networking I/O Programmierer muss kaum etwas über die Fähigkeiten des Geräts wissen Networking und I/O werden mit Hilfe des gleichen Interfaces implementiert Alle Verbindungen werden mit einer Methode der Klasse Connector erstellt Beispiele: HTTP: Connector.open("www.foo.com"); Sockets: Connector.open("socket://192.168.0.1:9000"); Datagrams: Connector.open("datagram://192.168.0.1"); Dieses Verhalten basiert auf dem Generic Connection Framework (GCF), welches folgende Schnittstellenarten unterstützt: serieller input serieller output datagram Kommunikation verbindungsorientiert, z.B. TCP/IP Benachrichtigungs-Mechanismus für Client-Server Kommunikation basic web server connections Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 13 Sicherheit Java Klassen sind überprüft und garantieren, dass sie gültige JavaAnwendungen sind. Die Klassen werden nach dem Kompilieren vorgeprüft (pre-verified), so dass die CLDC Implementierung weniger leisten muss um das .jar zu verifizieren nur ein begrenztes, vordefiniertes Set an JavaAPI´s steht zur Verfügung Das Herunterladen und Managen der Anwendungen findet auf dem native code Level innerhalb der VM statt. Keine vom Anwender definierbaren class-loader stehen zur Verfügung. Das Set der native functions, die der VM zur Verfügung stehen kann nicht erweitert werden. Der Programmierer kann Klassen bestimmter Pakete nicht überschreiben weitere Schutzmechanismen werden über das Profil realisiert Kritische Anmerkungen s. http://www.heise.de/newsticker/meldung/52321 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK MIDlet Suite RMS – von beiden MIDlets gemeinsam benutzte Ressource. Beinhaltet Grafiken und Sounds, aber auch eine kleine Datenbank, z.B. für Benutzerdaten oder HIghscores. JAD – beschreibt das MIDlet =======> Hello.jad: MIDlet-1: Hello, HelloEBV.png, Helloworld MIDlet-Jar-Size: 32694 MIDlet-Jar-URL: Hello.jar MIDlet-Name: Hello MIDlet-Version: 1.0 MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-2.0 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 14 MIDlet Lifecycle Die AMS startet das MIDlet und steuert auch seine Zustände. Quelle: Wiley Programming Java 2 Micro Edition for Symbian OS.(2004) 1.AMS erstellt eine neue Instanz eines MIDlets und ruft den Konstruktor des MIDlets auf. Anwendung ist dann PAUSED. Tritt hier ein Fehler auf wird in den DESTROYED Status gewechselt. 2.AMS führt startApp() aus. Nun ist die Anwendung ACTIVE und das MIDlet beginnt zu laufen. Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Grundgerüst eines MIDlets Public { public { } public { } public { } public { } class MIDletTest extends MIDlet MIDletTest() //Konstruktor void startApp() void pauseApp() void destroyApp(boolean unconditional) Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 15 Erstellen eines MIDlets Kompilieren – javac Preverifizieren – preverify.exe Packen – jar Descriptor (JAD) erstellen – editpad Uebung 1 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Erste Uebung import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class MeinErstesHandyProgramm extends MIDlet { private Display display = null; public MeinErstesHandyProgramm(){} // Diese Methode ist notwendig, denken Sie an das Applet public void startApp() { display = Display.getDisplay(this); display.setCurrent(new TextBox("TextBox", "Willi hat Husten", 50, 0)); } // Diese Methode ist notwendig public void pauseApp() { } // Diese Methode ist notwendig public void destroyApp(boolean unconditional) { } } Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 16 Zusätzliche Informationen BAT-Datei zur Abarbeitung der Befehle Plattform zur Ausführung (Emulator) Klassendatei für die MIDlets Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Die Klasse Displayable – MIDP UI API Es wird immer nur ein Displayable Objekt auf einmal auf dem Screen angezeigt jedes MIDlet wird mit einem DisplayableObjekt initialisiert: Display.setCurrent(Displayable); Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 17 Das J2ME Wireless Toolkit Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Anlegen eines neuen Projekts Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 18 Verzeichnisstruktur Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Uebung 2 Übertragen Sie den Source Code für das zweite Programm „Hello World“ in das richtige Verzeichnis und legen Sie ein neues Projekt an Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 19 Klassendesign MIDlet Displayable CommandListener {I} Canvas Display HelloWorld MyHelloCanvas Command Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Screen / Display Screen kümmert sich um Interaktion mit der Anwendung Rendern, Scrollen, grafische Anpassungen unabhängig von dem Gerät auf dem es läuft Die Benutzer- Display ist der Display Manager Es gibt folgende „Arten“ von Displayable Objects complex – von Screen abgeleitete Objekte, wie z.B. List oder TextBox generic – auch von Screen abgeleitet, kann aber andere Objekte beinhalten, z.B. Form, TextField user defined frames – von Canvas abgeleitete, frei definierbare Anzeige Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 20 Event Model Das Event Model (durch javax.microedition.lcdui implementiert) läuft auf High- und Low Level APIs managt die Benutzer Interaktion und fordert Screen-redraws reagiert durch „calls“ ans MIDlet UI Events Abstrakte Kommandos repräsentierende Events. Z.B. Exit bei Nokia immer unten rechts (via addCommand()) Tasten drücken und loslassen / bzw. pointer events [Touch Screen] Aufrufe an die paint-Methode einer Canvas Klasse (z.B. repaint() ) Aufruf von run() eines runnable Objekts. werden immer serialisiert abgearbeitet Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Die Command Klasse ein CommandListener reagiert auf Commands Command enthält folgende Infos: short label long label (optional) type [BACK, CANCEL, EXIT, HELP, ITEM, OK, SCREEN, STOP] priority [int] z.B. als Hilfe, welche Commands angezeigt werden Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 21 Uebung 03 mit der Game Canvas Displayable Display Runnable {I} Canvas Sprite MySprite backwards( ) tick( ) getDirection() GameCanvas MyPauseCanvas paint( ) MyGameCanvas start( ) stop( ) run( ) draw(Graphics) createSprite( ) :mySprite MIDlet HelloWorld startApp( ) pauseApp( ) destroyApp( ) commandAction(Command,Disp layable) Command Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Hinweise zur Uebung 03 Dieses HelloWorld Beispiel ist etwas umfangreicher als das erste und „sauberer“ programmiert es gibt drei Commands über die sich der MIDlet Ablauf steuern lässt exit=new Command("Exit",Command.EXIT,1); Helloworld.java pause=new Command("Pause",Command.ITEM,2); resume=new Command("Resume",Command.ITEM,2 Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 22 Hinweise zur Uebung 03 zwei Canvas werden benutzt. Eine beerbt die seit MIDP2.0 zur Verfügung stehende Klasse GameCanvas (in javax.microedition.lcdui.game ), die andere ist von Canvas (javax.microedition.lcdui) abgeleitet. Die Commands werden sinngemäß auf sie verteilt gameCanvas.addCommand(exit); Helloworld.java gameCanvas.addCommand(pause); gameCanvas.setCommandListener(this); die Klasse Helloworld (extends MIDlet) dient als CommandListener. Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Weitere Feinheiten >Die Klasse MyGameCanvas implementiert Runnable und läuft als Thread. synchronized void start() { running=true; thread=new Thread(this); thread.start(); } MyGameCanvas.java >Ausserdem hat die Klasse ein Sprite-Objekt, welches via factory pattern erstellt wird. private MySprite createSprite() { Image image=null; int height=0; int width=0; image = Image.createImage("/Splash.png"); width = image.getWidth(); height = image.getHeight() / MySprite.RAW_FRAMES; return new MySprite(image, width, height); } MyGameCanvas.java Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 23 Hinweise zu Sprites >Die Animation des Labels wird über ein Sprite Objekt realisiert. >Erstellt man eine Instanz der Klasse Sprite, mit der rechts zu sehenden Grafik (splash.png) und den Informationen über die Pixelmaße eines einzelnen Frames, so stehen einem viele nützliche Methoden zur Verfügung um mit dem Sprite zu arbeiten >wichtig: die Pixelgröße der Datei muss ein ganzzahliges Vielfaches der Größe eines einzelnen Frames sein Sprite(Image image, int frameWidth, int frameHeight) //konstruktor nextFrame() //nächstes frame setFrameSequence(int[] sequence) //frame reihenfolge setRefPixelPosition(int x, int y) //Referenz Pixel auf x/y setTransform(int transform) //drehen, spiegeln paint(Graphics g) //“malt“ das sprite Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Übung 4 Ein gegebenes Bild auf dem Handy anzeigen Uebung04 try { image = Image.createImage ("/Duke.png"); } catch (IOException e) { throw new RuntimeException ("Bild nicht gefunden: "+e); } Fügen Sie dazu Duke in das passende Verzeichnis und passen Sie den Quellcode an Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 24 Ein TextCanvas in einer eigenen Klasse Uebung05 Korrigieren Sie den Quellcode Verändern Sie die Farbe des Displays Verändern Sie weitere Details der Anzeige Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Zeichnen von geometrischen Formen Uebung06 ist Kunst Malen von geometrischen Formen auf das Canvas z.B. Binden Sie Teile diese Codes in das bestehende Programm ein for (int x = 0; x < w; x += 10) g.drawLine(0, w - x, x, 0); int z = 50; g.drawRect(z, z, 20, 20); z += 20; g.fillRoundRect(z, z, 20, 20, 5, 5); z += 20; g.drawArc(z, z, 20, 20, 0, 360); Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 25 Uebung07 Überarbeiten Sie die Auswahlliste Verändern Sie den Ticker Bringen Sie das Programm zum laufen… Tipp: public AuswahlMenue() { liste = new List("Namensliste: ",Choice.EXCLUSIVE); } Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK Uebung08 Spiel programmieren Gegeben sind verschiedene Quellen Ordnen Sie die Sourcen einem neuen Projekt zu und korrigieren Sie „wirklich nur einen kleinen Fehler“ Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 26 Übertragen der Programme auf das Handy Bitte suchen Sie sich ein Programm für Ihr Handy aus Je nach Möglichkeit kann die Übertragung per Kabel, WAP, Blue Tooth, Infra Rot erfolgen Hier spielt dann die JAD-Datei zur Evaluierung eine wichtige Rolle Prof. Dr.- Ing. Carsten Köhn LABOR FÜR MEDIEN, INTERNET UND ROBOTIK 27