获取 Cling 中的所有 DLNA 根存储目录?
Posted
技术标签:
【中文标题】获取 Cling 中的所有 DLNA 根存储目录?【英文标题】:Fetch all DLNA root storage directories in Cling? 【发布时间】:2011-06-20 23:17:18 【问题描述】:我正在使用很棒的 Cling
库来扫描我的网络以查找 UPnP 设备。我的目标是组装一个小的 DLNA 库浏览器,这样我就可以学习这项技术。到目前为止,我已经能够 1. 扫描网络并连接 UPnP 设备,2. 扫描每个远程设备并确定它是否运行 DLNA 服务,以及 3. 浏览已知节点的直接子节点。简而言之,这是我能够运行所有这些的方法:
public void remoteDeviceAdded(Registry registry, RemoteDevice device)
logger.debug("remote device added: []", device.getDetails().getFriendlyName(),
device.getType().getType());
if (device.getType().getType().equals("MediaServer"))
for (RemoteService service : device.getServices())
if (service.getServiceType().getType().equals("ContentDirectory"))
// '1' is Music, '2' is Video, '3' is Pictures
this.service.getControlPoint().execute(new Browse(service, "3", BrowseFlag.DIRECT_CHILDREN)
@Override public void received(ActionInvocation arg0,
DIDLContent didl)
logger.debug("found items.", didl.getItems().size());
@Override public void updateStatus(Status arg0) ;
@Override public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) ;
);
我知道,它可能看起来像一团糟,但它确实有效:) 当我进入调试器时,我可以看到我得到了什么。但是,与指南here 中的说明不同,我没有取回任何实际的媒体项目,只是浏览结果中的存储目录。这种做法很有意义,因为 DLNA 将事物组织成这样的层次结构:
Music
All Music
Artists
Fleetwood Mac
...
Albums
...
Video
All Video
Folders
...
我的问题是,浏览这些文件夹并爬上层次结构的最简单方法是什么?我已经连接到我正在寻找的 UPnP DLNA 服务器,现在如何获取这些根存储目录?在上面给出的浏览命令中,我实际上必须传递一些索引的字符串表示来获取“音乐”或“视频”等。如何获得***存储目录,然后如何浏览这些目录中的每一个?我的目标是至少构建一个简单的浏览器。
【问题讨论】:
【参考方案1】:好的,由于 Cling 邮件列表上的一些帮助,我可以回答我自己的问题。
显然,DLNA 中的所有元素都有一个唯一的 ID 号,您可以通过它在 Cling 中引用它们。为了获取/
,必须请求节点“0”。为了访问/../
(比顶部高一级!?),您可以请求节点“-1”。由于 DLNA 规范 不存在 在这个问题上毫无价值,这只是惯例。因此,请求节点“0”确实应该让您获得最高节点,但谁知道呢?它可能会给你带来一条红鲱鱼、一只狂暴的驼鹿或世界末日。风险是我们生活的目的,对吧?
无论如何,DLNA“文件系统”的工作方式如下:
/[0]
Browse Folders/[1]
Music/[2]
All Music/[5]
Heart Is Hard To Find[6]
...
...
Pictures/[3]
Video/[4]
因此,如果我想按顺序浏览节点“5”的“所有音乐”,我首先请求“0”,显示子容器,然后在用户交互时浏览节点“2”,然后在用户交互中浏览节点“5”,然后选择节点“6”,这是我正在寻找的实际文件,并对其执行一些操作。
了解 DLNA 的工作方式是促进这一切的关键。所有重要的东西都通过 HTTP 提供,对等点的检测通过 UPnP 促进。因此,首先,找到您网络上的所有 UPnP 客户端,然后对所有客户端进行排序并确定哪些客户端正在运行 DLNA,然后开始浏览。找到您要查找的内容,然后通过 HTTP 流式传输以进行播放。胜利的理论。
【讨论】:
你是怎么拿到文件的?我有容器,但 getItems() 总是空的。 didl.getContainers().get(0).getItems() 始终为空以上是关于获取 Cling 中的所有 DLNA 根存储目录?的主要内容,如果未能解决你的问题,请参考以下文章
如何从我的 Android 应用程序中的所有目录中获取所有 pdf 文件