Как мне разрешить доменное имя Bonjour на Android? - PullRequest
5 голосов
/ 12 декабря 2011

Мне нужно, чтобы мое приложение воспроизводило видеофайл, расположенный в моей сети. Я знаю, что URL файла:

http://something.local/abc.mp4

Теперь, когда я вручную заменяю "something.local" его истинным IP-адресом, MediaPlayer не имеет проблем с его воспроизведением. Тем не менее, когда у меня есть вышеуказанный адрес, MediaPlayer выдает ошибку с error (1, -1007).

Итак, я предполагаю, что это потому, что Android не понимает что-то «что-то локальное» как правильное.

У меня такой вопрос: как я могу сам "перевести" что-то .local в ip, чтобы затем передать его в MediaPlayer?

Небольшое предостережение: я считаю, что MediaPlayer не работает с IPv6-адресами, поэтому имейте это в виду ...


Просто примечание на случай, если это прояснит мою ситуацию: когда я запускаю ping something.local -4 в командной строке Windows, он возвращает:

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.

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

Во-первых, вам нужно прочитать документ о Bonjour (термин для iOS) или Zero Config (термин для Linux).

Чтобы понять, что что-то .local:

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

Например, если пользователь вводит steve.local. в веб-браузер, это говорит системе о многоадресной рассылке запроса на Стив на локальный сеть вместо отправки его на обычный DNS-сервер. Если Компьютер с поддержкой Bonjour по имени Стив находится в локальной сети, браузеру пользователя отправляется правильный IP-адрес для него. Это позволяет пользователи получают доступ к локальным хостам и сервисам без обычного DNS сервер.

Как решить эту проблему:

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

Для библиотеки Java предыдущие ответы предоставили достаточно хороший пример.

3 голосов
/ 19 декабря 2011

Вы должны попробовать этот фрагмент с API библиотеки jmDNS .. возможно, потребуются некоторые изменения.

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`
      }
 }
0 голосов
/ 14 декабря 2011

У вас есть доступ к java, net APIS на Android и вы можете использовать их для разрешения адресов.

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

Однако успех будет зависеть от правильной конфигурации сети.Ваше устройство получает настройку DNS-сервера через DHCP - поэтому вы находитесь в зависимости от сетевого провайдера

...