2013-04-28

Java Access Bridge unter Java SE 6

Ich wurde über XING angesprochen, ob ich Erfahrungen mit der Installation und Nutzung der Java Access Bridge habe und ob ich weiß, wie man diese Komponente unter Java SE 6 einsetzt. Da dachte ich mir "Warum nicht ein kleines Tutorial schreiben?".
Zu Beginn ein wichtiger Hinweis. Aktuelle Versionen von Java SE 7 bringen die Access Bridge bereits mit (derzeit 2.0.3). Sie ist allerdings standardmäßig deaktiviert und muss für ihre Benutzung über die Kommandozeile oder die Systemsteuerung aktiviert werden. Wie das funktioniert, ist hier beschrieben.
Das folgende Tutorial bezieht sich ausschließlich auf die Nutzung unter Java SE 6. Da ich schon vor längerer Zeit auf Java SE 7 umgestiegen bin, habe ich mir als Erstes ein 32-bittiges Java SE 6-SDK besorgt. Auf meinem 64-bittigen Windows 8 liegt dieses Installation unter C:\Program Files (x86)\Java\jdk1.6.0_33. Die Option, eine Public JRE zu installieren, hatte ich deselektiert.
Eine Stand alone-Access Bridge kann hier herunter geladen werden. Derzeit steht nur die ältere 2.0.2 zur Verfügung. Ich habe das Archiv accessbridge-2_0_2-fcs-bin-b06.zip in das Verzeichnis C:\Program Files (x86)\Java\Klassenbibliotheken entpackt. Der vollständige Pfad lautet demnach C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2. Das können Sie natürlich nach Belieben ändern.
Wir beginnen mit einem Negativ-Test. Da die Access Bridge unter Java SE 6 nicht installiert ist, darf das Tool Java Monkey keine Accessibility-Infos finden. Für den Test verwende ich Java2HTML von Markus Gebhard. Natürlich können Sie auch andere Swing-Anwendungen ausprobieren.
Öffnen Sie eine Eingabeaufforderung und geben "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\JavaMonkey-32" ein. Anschließend starten wir die Demoanwendung mit "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\bin\java" -jar "C:\Program Files (x86)\Tools\Java2HTML\java2html.jar"
Klicken Sie in der Menüleiste von JavaMonkey auf File, Refresh Tree. Der Arbeitsbereich des Fensters bleibt wie erwartet leer. Beenden Sie JavaMonkey und die Testanwendung. Nun kopieren wir die Bestandteile der Access Bridge in die entsprechenden Verzeichnisse. Damit der schreibende Zugriff in Systemverzeichnisse klappt, starten Sie die Eingabeaufforderung mit Administrator-Rechten. Falls Dateien schon vorhanden sind, würde ich sie nicht überschreiben.
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\WindowsAccessBridge-32.dll" C:\Windows\SYSWOW64
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\WindowsAccessBridge-64.dll" C:\Windows\System32
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\JavaAccessBridge-32.dll" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\bin"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\JavaAccessBridge-64.dll" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\bin"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\JAWTAccessBridge-32.dll" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\bin"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\JAWTAccessBridge-64.dll" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\bin"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\accessibility.properties" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\lib"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\access-bridge-32.jar" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\lib\ext"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\access-bridge-64.jar" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\lib\ext"
copy "C:\Program Files (x86)\Java\Klassenbibliotheken\accessbridge2_0_2\jaccess.jar" "C:\Program Files (x86)\Java\jdk1.6.0_33\jre\lib\ext"
Damit sind die Kopieroprationen abgeschlossen. Hier noch einmal die Erinnerung, dass sich die genannten Pfade auf ein 64-bittiges Windows und ein 32-bittiges JDK beziehen. Andere Konstellationen sind in der Installationsanleitung von Oracle beschrieben. Um die Installation zu prüfen, starten wir erneut JavaMonkry und die Demoanwendung. Wie das geht, habe ich ja zu Beginn dieses Tutorials beschrieben.
Screenshot: Java Monkey
Screenshot: Java Monkey

2013-04-24

MB Logic 5

In diesem Post habe ich eine kleine Fotostrecke für Sie, das Handheld-Spiel MB Logic 5. Es kam 1977 auf den mit verschiedenen Namen auf den Markt. So hieß es in Japan Pythaugoras, in anderen Regionen Logic 5 oder COMP IV. Im Handheld Games Museum finden Sie unter anderem die Bedienungsanleitung für den COMP IV sowie Fotos der Verpackungen.

Hier nun die Fotos meines Logic 5:

MB Logic 5 Front 2MB Logic 5 Front
MB Logic 5 schräg linksMB Logic 5 schräg rechtsMB Logic 5 unten

2013-04-22

IPEVO Point 2 View

Um während eines Vortrags über die Geschichte der mobilen Datenverarbeitung den Bildschirminhalt meiner alten Hardware zeigen zu können, war ich auf der Suche nach einer Art Webcam, die über mehrere Gelenke beweglich sein sollte. Die Darstellung sollte über “VGA-Niveau” liegen, Abzüge in Postergröße wollte ich aber nicht machen.
Eher zufällig bin ich auf die IPEVO Point 2 View gestoßen. Die eigentliche Kamera erinnert irgendwie an eine MAG-LITE, kann aber auf einem stabil wirkenden, im Sockel beschwerten Standfuß montiert werden. Die 2 Megapixel auflösende Optik kennt kontinuierlichen und manuellen Autofokus und kann auf Knopfdruck Einzelbilder des aktuellen Signals machen. Ein solches Bild ist im folgenden Screenshot zu sehen:
Screenshot der Point 2 View-Software
Screenshot der Point 2 View-Software
Die Point 2 View-Software ist wie die Hardware wohltuend einfach gehalten. Mittels drei Reitern schalten Sie zwischen der Live-Anzeige, den gemachten Einzelbildern und einem Vollbild-Modus um. Die Funktionen der Kamera lassen sich durch physikalische Tasten am Gerät und über die Anwendung auslösen.
Das Schöne an dieser USB-Kamera ist, dass man mit der Optik bis auf 5 cm an das Motiv heran kann. Und gerade während Präsentationen empfindet man die schnörkellose Bedienung als angenehm. Wenn Sie auf der Suche nach einer robusten Kamera für Live-Demos sind, sollten Sie sich die Point 2 View auf jeden Fall ansehen.

2013-04-20

Jelly Bean für das Sony Xperia Tablet S

Etwas früher als erwartet (die letzten Aussagen waren “Ende April” oder “Anfang Mai” hat Sony hier in Deutschland mit dem Ausrollen von Jelly Bean für das Xperia Tablet S begonnen.

Screenshot: Systeminformationen Sony Xperia Tablet S
Screenshot: Systeminformationen Sony Xperia Tablet S

Dass es kein Android 4.2 sondern “nur” 4.1 werden würde, war schon lange klar. Ich würde das aber nicht überbewerten – wenn man nicht gerade Artikel und Bücher über Android schreibt, sollte man sich von dem schnellen Versionswechsel nicht verrückt machen lassen.

Was nach wenigen Minuten Arbeit auffällt ist der Performancezuwachs. Das Tablet bedient sich viel weicher und flüssiger. Und jetzt ist endlich auch Google Now an Board. Hierzu ein paar Tipps. Wer Google Now auf dem Smartphone kennt, ist gewohnt, einfach von unten ins Display zu wischen. Das habe ich probiert – und es hat nicht funktioniert. Mein Fehler war, horizontal gesehen in der Mitte zu wischen. Offenbar reagieren aber nur die Elemente der Systembar Home, Zurück und zuletzt benutzte Apps.

Screenshot: Google Now öffnen
Screenshot: Google Now öffnen

Beginnt man mit dem Wischen in diesem Bereich, funktioniert der Start von Google Now wie gewünscht. Eine weitere Möglichkeit ist Tippen und Halten von Home:

Screenshot: Tippen und Halten von Home
Screenshot: Tippen und Halten von Home

Tisch-, Taschenrechner und elektronisches Spielzeug

Gestern habe ich auf dem MATHEMA Campus 2013 einen Vortrag über die Geschichte der mobilen Datenverarbeitung gehalten. Leider stand mir wegen eines Synchronisierungsproblems nicht die aktuellste Version meiner Folien zur Verfügung. So haben meine Zuhörerinnen und Zuhörer ein paar sehr schöne Fotos verpasst. Diese möchte ich gerne nachreichen. Hier zunächst ein paar meiner Tisch- und Taschenrechner:
Sanyo CX-8033
Sanyo CX-8033
Commodore 447D
Commodore 447D
Commodore GL996R costum green line
Commodore GL996R costum green line
Robotron Konkret 100
Robotron Konkret 100
Texas Instruments TI-3500
Texas Instruments TI-3500
Im Folgenden sehen Sie ein paar elektronische Spielzeuge, die in den späten 70ern oder. frühen 80ern produziert wurden:
Super 12
Super 12
Parker Merlin
Parker Merlin
Chess Champion Delta1
Chess Champion Delta1

2013-04-12

Widget-Hintergrund setzen

In bisherigen TKWeek-Versionen hatten Appwidgets einen zu 50% transparenten Hintergrund. Das sah eigentlich recht hübsch aus. Spätestens seit diesem Post wissen Sie aber, dass ich das Ganze einstellbar gemacht habe. Der Grund ist einfach – den Anwendern gefällt es, das Erscheinungsbild feinzutunen.
Setzt man die Deckkraft auf 0, scheint der Hintergrund vollständig durch. Das sieht so aus:
Screenshot: Zwei TKWeek-Appwidgets mit transparenten Hintergrund
Screenshot: Zwei TKWeek-Appwidgets mit transparenten Hintergrund
Die Transparenz des Hintergrunds lässt sich in Android sehr einfach durch Setzen der Bits 24 bis 31 des Farbwerts einstellen. 0 bedeutet durchsichtig, 255 heißt vollständig deckend. Soll der Wert nicht änderbar sein, geschieht dies bequem in der Layoutdatei. Zur Laufzeit gestaltet es sich ebenfalls einfach, wenn die Methode setBackground() vorhanden ist. Das ist bei allen Views der Fall – oder?
Sehen wir uns ein Quelltextfragment an, das Appwidgets darstellt.
 final RemoteViews updateViews = new RemoteViews(  
       context.getPackageName(), R.layout.datewidget_layout);  
 ...  
 // auf Antippen reagieren  
 Intent intent = new Intent(context, MyDayActivity.class);  
 PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,  
       intent, 0);  
 updateViews.setOnClickPendingIntent(R.id.datewidget_id, pendingIntent);  
 appWidgetManager.updateAppWidget(appWidgetIds, updateViews);  
RemoteViews beschreiben eine View-Hierarchie, die in einem anderen Prozess angezeigt werden kann. Die Hierarchie wird aus einer Layoutdatei entfaltet. Die Klasse bietet einige grundlegende Operationen, um den Inhalt der entfalteten View-Hierarchie zu modifizieren. Wenn Sie nach einer Methode setBackground() suchen, werden Sie aber leider nicht fündig.
Folgendes Quelltextfragment führt aber doch zum Erfolg:
 public static void setWidgetAppearance(Context context, RemoteViews views,  
       int resid) {  
    int opacity = WidgetPreference.getOpacity(context);  
    int color = 0x000000;  
    opacity <<= 24;  
    views.setInt(resid, "setBackgroundColor", opacity | color);  
 }  
Die Magie ist, der RemoteViews-Instanz zu sagen, eine bestimmte Methode des durch resid identifizierten Views aufzurufen. In unserem Fall ist dies setBackground(). Auf diese Weise kann beispielsweise auch die Vordergrundfarbe eingestellt werden.

2013-04-06

Anatomie eines unscheinbaren Fehlers

Es ist immer wieder unangenehm, wenn man in der Android Developer Console so etwas sieht:

Screenshot Android Developer Console
Screenshot Android Developer Console

Die App hat dann nämlich einen Fehler. In meinem Fall kann eine Activity nicht gestartet werden. Die Ausnahme ist insofern ungewöhnlich, als es bewährte Praxis ist, so etwas mittels try {} catch {} zu kapseln. Sollte da jemand schlampig gearbeitet haben??
Zwinkerndes Smiley

Werfen wir zunächst einen Blick auf den Stacktrace…

Screenshot Ausschnitt Stacktrace
Screenshot Ausschnitt Stacktrace

Hier wird versucht, eine E-Mail zu versenden.Und zwar nicht durch Code der App, sondern durch das System. Die letzte Zeile des Stacktrace-Ausschnitts gibt den entsprechenden Hinweis. Android kann den durch TextViews angezeigten Text auf Wunsch analysieren und beim Finden von Telefonnummern, Webadressen oder eben E-Mails mit korrespondierenden Aktionen verknüpfen. Dazu müssen in der korrespondierenden Layoutdatei nur wenige Attribute gesetzt werden.

 <TextView android:id="@+id/about_info"  
    android:paddingTop="6dip"  
    android:autoLink="web|email"  
    android:text="@string/welcome_text"  
    android:layout_below="@id/about_density"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
 />     

So sieht die Definition des auszugebenden Texts aus:

   <string name="welcome_text"><b>Thank you very   
 much for purchasing this app.   
 If you have any suggestions, please feel free  
 to contact me at kuennetht@googlemail.com.   
 </b>\n\n<b>Terms of use</b>\nThis   
 program is distributed in the hope that it will be useful,  
 ...  

Daraus wird dann zur Laufzeit:

Screenshot TKWeek-Programminfo-Seite
Screenshot TKWeek-Programminfo-Seite

Die Ausnahme Activity not found erscheint nach dem Antippen der E-Mail-Adresse. Aber nicht auf allen Geräten. Mein Nexus 4 öffnet wie erwartet den Gmail-Editor zum Erfassen und Versenden von E-Mails. Jetzt höre ich Sie schon sagen: OK, aber was passiert auf Geräten, die kein Gmail kennen? Der Emulator imitiert so ein System (keine Gmail-App). Ich möchte schon fast sagen, dummerweise, kommt hier aber:

Screenshot: Hinweis, dass eine Aktion nicht ausgeführt werden konnte
Screenshot: Hinweis, dass eine Aktion nicht ausgeführt werden konnte

Im Emulator werden Ausnahmen also sauber abgefangen und als halbwegs verständliche Nachricht an den Anwender weitergegeben.

…ich merke schon, Sie lassen nicht locker. Ihnen kommt der Gedanke, es könnte an der Android-Version liegen. Schön wär’s, aber mein Sony Xperia Tablet S hat mit Android 4.0.3 die gleiche Systemversion wie das verwendete Emulatorabbild:

Screenshot rrrrrrrummmmmssssssssss
Screenshot rrrrrrrummmmmssssssssss

…rrrruuuuuummmmmssssssss……..

Noch geben wir nicht auf. Gelegentlich kann man lesen, dass man die (nicht Gmail-) Mail-App konfigurieren muss, danach würde die Activity gefunden. In der Tat kommt danach im Emulator nicht mehr die bereits gezeigte Meldung, sondern die Activity zur Eingabe von E-Mails. Hierzu ein Screenshot – wieder Android-Emulator mit Plattformversion 4.0.3, nur ein anderer Formfaktor

Screenshot: Androids Email-App
Screenshot: Androids Email-App

Soweit so gut. Das Xperia Tablet S hat die Gmail-App an Board. Insofern scheint es widersinnig, zusätzlich noch “die andere” Email-App einrichten zu müssen. Dennoch konfigurieren wir – des Spaßes wegen – diese.

Screenshot Erfassen einer E-Mail auf dem Xperia Tablet S
Screenshot Erfassen einer E-Mail auf dem Xperia Tablet S

Es funktioniert! Raufen Sie sich bitte mit mir die Haare…
Zwinkerndes Smiley

Fassen wir unsere Erkenntnisse zusammen. Dass auf Geräten nur dann ein Editor zum Erfassen von E-Mails erscheint, wenn eine entsprechend konfigurierte App installiert ist, ist einleuchtend. Dass Emulator und echtes Gerät mit derselben Plattformversion unterschiedliches Verhalten zeigen, ist merkwürdig aber akzeptabel. Dass man als Anwender auf einem Tablet mit konfigurierter Gmail-App zusätzlich noch die “eingebaute” konfigurieren muss, macht hingegen fassungslos. Zumal – Sie erinnern sich – dies auf meinem Nexus 4 nicht nötig war. Schreiben Sie mir – was halten Sie davon?