• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Startprobleme mit Java, AppleScript und iTunes

derJan

Gast
N'Abend Apfeltalk!

Ich bin gerade eine bisschen am experimentieren (okay: rumspielen ;)) mit Java und AppleScript. Ich wurde zum Anfang gerne mein iTunes ansprechen. Über google hab ich auf macosxhints.com einen entsprechenden Artikel gefunden. Wenn ich die Klasse jetzt nutzte, dauert es sehr lange (30-60 Sekunden) bis iTunes angesprochen wird. Der Quelltext ist 1:1 von macosxhints.com übernommen und wurde nur noch mit einer statischen main-Methode von mir ausgestattet.
Code:
import com.apple.cocoa.foundation.*;

public class iTunesControl {

  public void play() {    doScript("tell application \"itunes\" to play"); }
  public void pause() {   doScript("tell application \"itunes\" to pause"); }
  public void next() {    doScript("tell application \"itunes\" to next track"); }
  public void previous() {doScript("tell application \"itunes\" to previous track"); }
  
  private void doScript(String script) {
        
    // This creates a new NSAppleScript
    // object to execute the script
    NSAppleScript myScript = new NSAppleScript(script);

    // This dictionary holds any errors that are
    // encountered during script execution
    NSMutableDictionary errors = new NSMutableDictionary(); 

    // Execute the script!
    myScript.execute(errors); 
  }
  
  public static void main( String [] args )
  {
     iTunesControl a = new iTunesControl();
     a.pause();
   }
}

Der Build Prozess wurde mit folgenden Befehlen durchgeführt.

Code:
# export CLASSPATH=/System/Library/Java:
# javac iTunesControl.java
# java iTunesControl

Hat vielleicht jemand eine Idee wo mein Fehler liegt?
Danke für's grübeln :)

Jan
 

derJan

Gast
Vielleicht ist noch ganz interessant zu wissen, dass nur der erste Befehl so lange zum Laden braucht (hab ich eben erst rausgefunden). Wenn ich hinter das a.pause() gleich ein a.next() setze, dauert es erst seine Zeit bis die Musik stoppt und gleich dannach wird auf das nächste Lied gesprungen.

Kann es sein, dass bei dem Verbindungsaufbau mit iTunes irgendwas schief läuft?
Jan
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Mal 'ne Java-Laien-Frage: Sollte die main-Funktion nicht eine geschweifte Klammer weiter draussen sein? Oder ist es Absicht, dass die innerhalb der iTunesControl-Klasse definiert ist?

EDIT: Danke MatzeLoCal (s.u.)!
 
Zuletzt bearbeitet:

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Nö, main() muss in der "Ladeklasse" sein.

Code:
public class MeineKlasse {

    public static void main(String[] args) {
     //hier passiert was
    }
}

ist das Standardgerüst.
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Deine Java-Klasse wird so nicht gefunden. Probier mal
java ./iTunesControl
wenn du in deren Verzeichnis bist.
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Also ich kann nur sagen, dass das bei mir alles super funzt...
 

derJan

Gast
Erstmal danke an alle die sich gedanken zu dem Problem gemacht haben.

Code:
$ java ./iTunesControl
Exception in thread "main" java.lang.NoClassDefFoundError: //iTunesControl
Die Klasse wird schon gefunden. Wenn ich mit System.out.println ein paar Debug-Meldungen mit einfügt, dann werden die auch brav, bis zum myScript.execute() in doScript(), ausgeführt.

Ich hab mir nochmal die Kommentar zu dem oben angegebenen Artikel durchgelesen. Ganz unten (Überschrift: " doesnt work for me") beschreibt auch jemand, dass es bei ihm klappt, wenn iTunes nicht gestartet ist. Das ist bei mir auch der Fall. Kann es sein, dass die Java/Applescript Schnittstelle etwas buggy ist? Wenn ich die Applescript Befehle bei geöffnetem iTunes im ScriptEditor ausführe, funktioniert es nämlich ...
Gibt es evtl noch Java Debug-Methoden, welche mir die einzelnen Schritte, bei der Kommunikation mit Applescript, ausgeben?

Jan
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Nö nö, das ./ kannst Du dir sparen.. das ist nicht von nöten.
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
So, im Anhang ist nun mal die .java und die .class die ich daraus kompiliert habe.

Wie gesagt, alles von oben copy&paste. ... nach dem aufruf von

java iTunesControl dauert es einen klitzekleinen Moment (java muss ja gestartet werden) und dann is iTunes ruhig.
 

Anhänge

  • iTunesControl.zip
    1,4 KB · Aufrufe: 66

derJan

Gast
Wenn ich deine Java-Class starte, geht iTunes sofort auf pause, allerdings nur beim ersten mal.
Was mir allerdings gerade einfällt: welche Java-Version benutzt du? Ich bin irgendwann glaub ich mal manuell auf Java 1.5 gegangen. Kann es evtl daran liegen?
Code:
$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-112)
Java HotSpot(TM) Client VM (build 1.5.0_06-64, mixed mode, sharing)

Jan
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
Code:
% java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-112)
Java HotSpot(TM) Client VM (build 1.5.0_06-64, mixed mode, sharing)

Wie "nur beim erstmal"?

Pausiger als Pause geht doch nicht, oder :)
 

derJan

Gast
Doch es geht :)
Wenn ich das Programm zum ersten mal starte und iTunes spielt, dann geht er nach 1-2 Sekunden auf Pause. Wenn ich dann iTunes wieder von Hand auf Play stelle und das Programm erneut starte, dann dauert es wieder eine Ewigkeit ...
Ein sehr merkwürdiges Problem. Irgendwo meine ich auch gelesen zu haben, dass Apple die Java Schnittstelle nicht mehr Supportet, stimmt das?

Jan