有一种非常简单的方法,可以在几种不同的设备上给我带来积极的结果。
当设备连接到路由器时,它会接收 IP(即 DHCP)并在 DNS 中注册名称。注册的名称似乎总是采用以下形式android_nnnnnnnn
.
当然,您可以使用相同的方法命名任何计算机并欺骗检查,从而导致误报......
另外,我无法确保所有设备供应商都遵循相同的方法,但我发现它可以在我测试过的不同品牌(包括不同 SDK 级别)的一些设备中正常工作。
--编辑--
怎么做
这取决于您将在哪里运行代码来发现 Android 设备。假设您将在 Android 设备中运行代码:
-
首先发现响应的设备ping
在你的网络中。您可以使用我对这篇文章的回答中的代码:执行命令() https://stackoverflow.com/questions/13534419/check-to-see-whether-root-was-granted/13535315#13535315运行 ping 命令。
-
使用以下代码获取响应设备的名称:
InetAddress inetAddress = InetAddress.getByName(string_with_ip_addr);
字符串名称 = inetAddress.getCanonicalHostName();
--编辑2--
概念证明
下面的方法只是我上面所写内容的概念证明。
我在用着isReachable()
生成 ICMP 请求的方法,在许多帖子中据说仅适用于 root 设备,用于测试它的设备就是这种情况。但是,我没有为运行此代码的应用程序授予 root 权限,因此我相信它无法设置 SIUD 位,这就是为什么有人声称此方法失败的原因。我想从某人在非 root 设备上测试它的角度来进行此操作。
调用使用:
ArrayList<String> hosts = scanSubNet("192.168.1.");
它返回于hosts
,响应 ping 请求的设备名称列表。
private ArrayList<String> scanSubNet(String subnet){
ArrayList<String> hosts = new ArrayList<String>();
InetAddress inetAddress = null;
for(int i=1; i<10; i++){
Log.d(TAG, "Trying: " + subnet + String.valueOf(i));
try {
inetAddress = InetAddress.getByName(subnet + String.valueOf(i));
if(inetAddress.isReachable(1000)){
hosts.add(inetAddress.getHostName());
Log.d(TAG, inetAddress.getHostName());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return hosts;
}
Regards.