Growl ist DAS Benachrichtigungssystem unterm Mac, wenn es darum geht, dem Nutzer über neue Mails, abgeschlossene Downloads oder neue Chatnachrichten zu informieren. Was ich bisher nicht wusste, man kann Growl auch über Java ansteuern und entsprechende Benachrichtigungen an Growl schicken.
Ich zeige anhand eines klitzekleinen Beispielprogramms, wie man Growl nutzen kann.
Zuerst muss man sich das SDK von http://growl.info/downloads_developers.php herunter laden. Darin enthalten ist die API-Dokumentation und eine Klasse (com.growl.Growl), die den Zugriff auf Growl wrappt. Falls das heruntergeladenen DMG nicht automatisch gemountet wird, dies nun machen. Unter Bindings/Java finden sich die für Java-Entwickler interessanten Dateien. Im Verzeichnis Bindings/Java/docs befindet sich die API-Dokumentation, die kann man sich lokal kopieren, ist aber nicht unbedingt notwendig. Unter Bindings/Java/Source befindet sich die Wrapper-Klasse für Growl, diese wird gleich benötigt.
In der IDE seines Vertrauens erstellt man nun ein neues Java-Projekt. In das Source-Verzeichnis kopiert man die Growl-Klasse (aus Bindings/Java/Source) inklusive der Verzeichnisse, also com markieren und per Copy & Paste ins Sourceverzeichnis kopieren. Im Normalfall sollte die IDE jetzt meckern, dass sie die Klassen und Packages (com.apple.cocoa…), die im Import-Teil der Growl-Klasse stehen, nicht auflösen kann. Dazu muss in den Klassenpfad des Projektes noch folgendes Verzeichnis mit aufgenommen werden: /System/Library/Java. Nun sollte es keinen Fehler mehr geben, die Import-Anweisung dürften aber noch markiert sein, da die verwendeten Klassen laut Apple deprecated sind.
Growl zeigt bei den Benachrichtigungen noch ein Symbol an, dies sollte in der Regel das Symbol der Anwendung sein, die die Benachrichtigung an Growl sendet. Dazu ist es in unserem kleinen Beispiel notwendig, eine PNG-Grafik mit 32 x 32 Pixeln zu erstellen. Im Codebeispiel wird angenommen, die Grafik ist über folgenden Pfad auf dem System erreichbar: /image/GrowlTest.png.
Hier nun das Codebeispiel, anschliessend noch ein paar Erklärungen zum Code:
package de.yellowshoes.growl.example;
import com.growl.Growl;
public class GrowlExample
{
public static void main(String[] args) throws Exception
{
String GROWL_EXAMPLE_NOTIFY_01 = "ExampleNotification_01";
String[] notifications = { GROWL_EXAMPLE_NOTIFY_01 };
Growl growl = new Growl( "MyApp", notifications, notifications );
growl.register();
growl.notifyGrowlOf( GROWL_EXAMPLE_NOTIFY_01,
"Ein Beispiel",
"Hier steht die Beschreibung des Events" );
growl.notifyGrowlOf( GROWL_EXAMPLE_NOTIFY_01,
"/image/GrowlTest.png",
"Zweites Beispiel",
"Und noch eine Beschreibung" );
} }
Die Variable GROWL_EXAMPLE_NOTIFY_01 bezeichnet einen möglichen Benachrichtigungsevent, der von Seiten der Applikation an Growl geschickt werden kann. Bei der Initialisierung der Wrapperklasse (Growl growl = new Growl….) übergibt man zuerst den Namen der Applikation (MyApp), die die Benachrichtigungen an Growl schicken wird, anschliessend einen Array mit allen möglichen Benachrichtigungsevents der Applikation und als dritten Parameter ein Array mit allen Benachrichtungsevents, die per default aktiviert sein sollen.
Das Abschicken der Benachrichtigungsevents (growl.notifyGrowlOf….) sollte eigentlich selbsterklärend sein. Der Unterschied besteht hier darin, das beim zweiten Aufruf das eigene Symbol mit angezeigt wird.