【问题标题】:How do I resolve a Bonjour domain name on Android?如何在 Android 上解析 Bonjour 域名?
【发布时间】:2011-12-12 06:17:05
【问题描述】:

我需要让我的应用程序播放位于我网络上的视频文件。我知道文件的网址是:

http://something.local/abc.mp4

现在,当我手动将“something.local”替换为其真实 IP 地址时,MediaPlayer 播放它没有问题。尽管如此,当我有上面的地址时,MediaPlayererror (1, -1007) 错误。

所以我假设这是因为 Android 不理解“something.local”是正确的。

我的问题是:我如何自己“翻译”something.local 到一个 ip,然后我可以将它传递给MediaPlayer

一个小警告:我认为MediaPlayer 不适用于 IPv6 地址,所以请记住这一点...


只是一个旁注,以防它使我的情况更清楚:当我在 Windows 命令提示符下运行 ping something.local -4 时,它返回:

Pinging something.local [192.168.1.126] with 32 bytes of data:
Reply from 192.168.1.126: bytes=32 time=145ms TTL=64
Reply from 192.168.1.126: bytes=32 time=112ms TTL=64
Reply from 192.168.1.126: bytes=32 time=32ms TTL=64
Reply from 192.168.1.126: bytes=32 time=169ms TTL=64

windows 从something.local -> 192.168.1.126 转到的那个翻译是我想在我的 Android 应用程序中做的。

【问题讨论】:

  • @Jens 我似乎在 jmdns 中找不到任何允许解析域的内容。你能指出我应该去哪里看吗?
  • 嗯,Bonjour 不只是 Apple 的 zeroconf 语言吗?在这种情况下,我会查看DiscoveryActivity。如果不是 - 那么我的错:-D

标签: android bonjour


【解决方案1】:

首先,您需要阅读有关 Bonjour(iOS 术语)或 Zero Config(Linux 术语)的文档。

要了解什么是something.local:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NetServices/Articles/about.html#//apple_ref/doc/uid/TP40002458-SW1

例如,如果用户键入 steve.local。进入网络浏览器,这 告诉系统在本地多播对 steve 的请求 网络而不是将其发送到传统的 DNS 服务器。如果一个 启用 Bonjour 的名为 steve 的计算机位于本地网络上, 用户的浏览器会收到正确的 IP 地址。这允许 用户无需传统 DNS 即可访问本地主机和服务 服务器。

如何解决:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NetServices/Articles/NetServicesArchitecture.html#//apple_ref/doc/uid/20001074-SW1

对于 java 库,以前的答案提供了足够好的示例。

【讨论】:

    【解决方案2】:

    你应该试试这个带有 jmDNS library api 的 sn-p.. 可能需要一些更改。

    JmDNS jmdns =  JmDNS.create();
    
    DNSEntry addressEntry = jmdns.getCache().getDNSEntry(name, DNSRecordType.TYPE_A, DNSRecordClass.CLASS_ANY);
     if (addressEntry instanceof DNSRecord) {
          ServiceInfo cachedAddressInfo = ((DNSRecord) addressEntry).getServiceInfo(true);
          if (cachedAddressInfo != null) {
          for (Inet4Address address : cachedAddressInfo.getInet4Addresses()) {
              //  use the `address`
          }
     }
    

    【讨论】:

    • 唯一的问题是您引用的方法(如 getCache())不是公开的,也不是 API 的一部分...
    【解决方案3】:

    您可以访问安卓上的 java、net APIS,并可以使用它们来解析地址。

    http://docs.oracle.com/javase/1.4.2/docs/api/java/net/InetAddress.html

    但是,成功将取决于网络的正确配置。您的设备通过 DHCP 接收 DNS 服务器设置 - 所以您受制于网络提供商

    【讨论】:

    • 我在两个不同的 Android 设备上进行了测试。他们都无法解析 bonjour 名称。 (即“something.local”)
    • @Konstantine bonjour/zero conf 的全部要点是根本没有任何 DNS 服务器设置。这需要在没有任何 DNS 参与的情况下完成。大概@yydi 正在谈论一个典型的家庭网络,上面有一台PC,它将响应something.local 的零配置查找。
    • DNS 设置仍然存在 - 您只是看不到它。
    • @KonstantinPribluda 我认为这取决于底层实现。您的答案适用于我的 Windows PC(安装了 Bonjour——尽管我不确定这是否与它有关)。另一方面,在我的 Android 上,它失败了。
    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多