Как разрешить доменное имя Bonjour на Android?

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

http://something.local/abc.mp4

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

Я предполагаю, что это потому, что Android не понимает "something.local" как правильный.

У меня вопрос: как я могу сам "перевести" something.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

Это то, что я хочу сделать в своем приложении для Android.


person yydl    schedule 12.12.2011    source источник
comment
home.heeere.com/tech-androidjmdns.html   -  person Jens    schedule 15.12.2011
comment
@Jens Я не могу найти в jmdns ничего, что позволяло бы разрешить домен. Вы можете указать, где я должен искать?   -  person yydl    schedule 19.12.2011
comment
Хм, разве Bonjour - это не просто язык Apple, означающий zeroconf? В этом случае я бы посмотрел на DiscoveryActivity. Если нет - то мой плохой :-D   -  person Jens    schedule 19.12.2011


Ответы (3)


Во-первых, вам нужно прочитать документ о 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. в веб-браузер, это говорит системе о необходимости многоадресной рассылки запроса для Стива в локальной сети вместо отправки его на обычный DNS-сервер. Если компьютер steve с поддержкой Bonjour находится в локальной сети, браузеру пользователя отправляется правильный IP-адрес для него. Это позволяет пользователям получать доступ к локальным хостам и службам без обычного DNS-сервера.

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

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

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

person pinxue    schedule 20.12.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`
      }
 }
person Ronnie    schedule 19.12.2011
comment
Единственная проблема заключается в том, что методы, на которые вы ссылаетесь (например, getCache ()), не являются общедоступными и не являются частью API ... - person yydl; 15.12.2012

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

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

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

person Konstantin Pribluda    schedule 14.12.2011
comment
Я тестировал это на двух разных устройствах Android. Они оба не смогли разобрать имя Bonjour. (т.е. something.local) - person yydl; 19.12.2011
comment
@Konstantine вся суть bonjour / zero conf заключается в том, чтобы вообще не настраивать DNS-сервер. Это нужно делать без участия DNS. Предположительно @yydi говорит о типичной домашней сети с ПК, который будет отвечать нулевым запросом конфигурации для something.local. - person Abhi Beckert; 20.12.2011
comment
Настройка DNS все еще есть - вы ее просто не видите. - person Konstantin Pribluda; 20.12.2011
comment
@KonstantinPribluda Я думаю, это зависит от базовой реализации. Ваш ответ работает на моем ПК с Windows (с установленным Bonjour - хотя я не уверен, связано ли это с этим). На моем Android, с другой стороны, это не работает. - person yydl; 21.12.2011