首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java中的D总线MPRIS访问Clementine实例

用Java中的D总线MPRIS访问Clementine实例
EN

Stack Overflow用户
提问于 2011-12-28 13:05:49
回答 1查看 1.6K关注 0票数 3

我用克莱门汀做音乐播放器。

它可以用D总线命令来控制.在命令行中,使用qdbus,我可以:

  • Start
  • Stop
  • 暂停播放机
  • 强制它跳过播放列表中的歌曲
  • 检查播放列表中当前播放的曲目及其元数据的长度。

我想在Java程序中这样做。我试着让事情正常工作,但不知怎么我不明白,我找不到一个示例代码,我可以使用我的程序。

下面是一个使用qdbus的示例会话,让您了解服务名称等等:

代码语言:javascript
复制
$ 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

我试图制作一个程序,它只打印播放列表中当前播放曲目的数量。我认为我需要首先创建一个界面,所以我创建了如下内容:

代码语言:javascript
复制
package my.package;

import org.freedesktop.dbus.DBusInterface;
import org.freedesktop.dbus.DBusInterfaceName;

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

然后我在这样的测试中用到了这个:

代码语言:javascript
复制
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

我肯定我犯了不止一个错误。有人能给我的方法提供投入吗?

EN

回答 1

Stack Overflow用户

发布于 2011-12-30 07:35:57

现在无法用Clementine测试它,但是getRemoteObject调用中指定的显式类型的以下方法适用于QuodLibet:

代码语言:javascript
复制
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();
}

调用:

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8656268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档