2011-12-28 14 views
1

私はClementineを音楽プレーヤーとして使用しています。JavaでD-Bus MPRISを使用してClementineインスタンスにアクセスする

D-Busコマンドで制御できます。コマンドラインで、qdbusを使用して、私がすることができます:

  • は、プレイリストの長さをチェックし、それはプレイリスト
  • で曲をスキップするプレイヤーに
  • フォースを一時停止

    • スタート
    • ストップ
    • プレイリスト内の現在再生中のトラックとそのメタデータを確認します。

    これはJavaプログラムで行います。私は物事を働かせようとしましたが、何とか私はそれを理解していないので、自分のプログラムに使用できるサンプルコードを見つけることができません。ここで

    はあなたのサービス名エトセトラのアイデアを与えるために、qdbusを使用したサンプルセッションです:

    $ qdbus org.mpris.clementine /TrackList 
    method int org.freedesktop.MediaPlayer.AddTrack(QString, bool) 
    method void org.freedesktop.MediaPlayer.DelTrack(int) 
    method int org.freedesktop.MediaPlayer.GetCurrentTrack() 
    method int org.freedesktop.MediaPlayer.GetLength() 
    method QVariantMap org.freedesktop.MediaPlayer.GetMetadata(int) 
    method void org.freedesktop.MediaPlayer.PlayTrack(int) 
    method void org.freedesktop.MediaPlayer.SetLoop(bool) 
    method void org.freedesktop.MediaPlayer.SetRandom(bool) 
    signal void org.freedesktop.MediaPlayer.TrackListChange(int) 
    method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) 
    method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name) 
    method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value) 
    method QString org.freedesktop.DBus.Introspectable.Introspect() 
    
    $ qdbus org.mpris.clementine /TrackList GetLength 
    13 
    
    $ qdbus org.mpris.clementine /TrackList GetCurrentTrack 
    7 
    
    $ qdbus org.mpris.clementine /TrackList GetMetadata 7 
    album: On The Wires Of Our Nerves 
    artist: Add N To X 
    audio-bitrate: 224 
    audio-samplerate: 44100 
    genre: Other 
    location: /media/nas-media/Music/Add_N_to_X/On_The_Wires_Of_Our_Nerves/08-King_Wasp.ogg 
    mtime: 215000 
    time: 215 
    title: King Wasp 
    tracknumber: 8 
    year: 1998 
    

    私だけのプレイリストに現在再生中のトラックの数を出力するプログラムを作成しようとしています。私は最初のインターフェイスを作成するために必要なと思ったので、私のようなものを作成しました:その後、私はこのようなテストでこれを使用

    package my.package; 
    
    import org.freedesktop.dbus.DBusInterface; 
    import org.freedesktop.dbus.DBusInterfaceName; 
    
    @DBusInterfaceName("org.freedesktop.MediaPlayer") 
    public interface TrackList extends DBusInterface { 
        int GetCurrentTrack(); 
    } 
    

    を:

    DBusConnection dc = DBusConnection.getConnection(DBusConnection.SESSION); 
    TrackList trackList = (TrackList) dc.getRemoteObject("org.mpris.clementine", "/TrackList"); 
    int currentTrack = trackList.GetCurrentTrack(); 
    System.out.println(currentTrack); 
    

    しかし、これは二行目のエラーを生成します。 java.lang.ClassCastException: $Proxy6 cannot be cast to my.package.TrackList

    私は複数の間違いを犯していると確信しています。誰かが私のアプローチにインプットを提供してもらえますか?

  • 答えて

    2

    は今クレメンタインでそれをテストすることはできませんが、getRemoteObject呼び出しで指定された明示的な型では、次のアプローチはQuodLibetのために働く:

    package my.sample; 
    
    import org.freedesktop.dbus.DBusInterface; 
    import org.freedesktop.dbus.DBusInterfaceName; 
    
    @DBusInterfaceName("net.sacredchao.QuodLibet") 
    public interface Quodlibet extends DBusInterface { 
        void Play(); 
        void Pause(); 
    } 
    

    呼び出し:

    DBusConnection dc = DBusConnection.getConnection(DBusConnection.SESSION); 
    Quodlibet player = dc.getRemoteObject("net.sacredchao.QuodLibet", 
        "/net/sacredchao/QuodLibet", Quodlibet.class); 
    player.Play(); 
    Thread.sleep(3000, 0); 
    player.Pause(); 
    dc.disconnect(); 
    
    関連する問題