如何在Android中使用mDNS从“ .local”解析ipv4和ipv6

问题描述

我正在尝试使用多播DNS从“ .local”解析IPv4和IpV6,并且尝试了https://github.com/posicks/mdnsjava,但无法解析所需的ipv4 / ipv6。另外,我找到了一个我有用的应用程序,却不知道它如何工作。

应用链接 https://play.google.com/store/apps/details?id=com.dokoden.dotlocalfinder

我还尝试使用Linux终端解析“ .local”-
用于解析ipv4的命令 avahi-resolve-host-name abc.local -4
用于解析ipv6的命令 avahi-resolve-host-name abc.local -6
它成功解决了。

我在Android中尝试使用相同的命令来解析“ .local”,但是却得到无法运行程序“ avahi-resolve-host-name”:error = 13,权限被拒绝

我正在Android中尝试这段代码-

  Process process = Runtime.getRuntime().exec("avahi-resolve-host-name casa.local -4");
  BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
  Log.d("OutPut",in.readLine());

解决方法

最后,我成功了。

我使用 mdnsjava 依存关系解析了Ipv4和Ipv6。

implementation "xyz.gianlu.mdnsjava:mdnsjava:2.2.1"

我使用以下代码段来解析Ipv4

for (Record record : new Lookup(localName,Type.A,DClass.IN).lookupRecords()) {
   if (record.getType() == Type.A) {
       ((ARecord) record).getAddress().getHostAddress();
       }
    }

在编写此代码段之前,您必须使用以下方式将MuticastLock放置在已连接的Wifi上

  WifiManager.MulticastLock multicastLoc = wifiManager.createMulticastLock("mDnsLock");
  multicastLoc.setReferenceCounted(true);
  multicastLoc.acquire();

并在获得IP后释放多播锁。

对于Ipv6,我只使用了相同的Ivv4代码段,此处的记录类型应为Type.AAAA代替Type.A

此代码适用于Android 10。

,

我不是100%可行,但是评论很大。

  1. 在您的AndroidManifest.xml
  2. 中检查以下权限
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. 以下链接可能有用: