为什么 ping 在某些设备上有效而在其他设备上无效?

Why does ping works on some devices and not others?

我的应用程序中有以下代码...

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
return process.waitFor();

... 我看到它在某些设备(例如摩托罗拉 G)上有效(returns 0)但在其他设备(例如摩托罗拉 G)上无效(returns 2)盖乐世 S3)。我已经检查了 Galaxy S3 设备,它确实有一个“/system/bin/ping”文件,当然我已经确定它确实已连接到互联网。

任何人都知道为什么该命令可能 不能 在某些设备上工作......我可以做些什么来让它工作?

每个 OEM(原始设备制造商)执行 ping 的方式可能不同。这不仅限于ping。例如,在 adb shell.

上尝试 运行 在旧三星设备 (S3) 和较新设备 (Motorola G) 上使用 linux du 命令

S3 确实支持 du,但它不带一些参数,例如 -m(以兆字节显示),而较新的设备,例如 Moto G 甚至三星设备(过去的 Galaxy S5)都支持它。在 S3 中的 adb shell 上尝试 运行ning ping -c 1 8.8.8.8,您会注意到这不是您的 Java 代码,而是 OEM。

同样,根据 Android 版本和设备,甚至 dumpsys 等命令也有不同格式的输出。因此,如果您可以使用完全不同的方法尝试使用 Android 中提供的 API 来 ping 所需的 IP,而不是使用每个 OEM 可能支持不同参数的过程,那将是最好的。

也可能是每个设备的权限不同。

当您 运行 您的应用程序中的进程时,您只是授予该应用程序对该进程的有限权限。因此,如果 ping 需要根级别权限(在特定设备上),这也可能是它不起作用的原因。最终取决于 OEM 如何定制 Android。

来源:我在 OEM 工作。

已解决:需要让 phone 知道在 LAN 网络上。安装任何网络管理应用程序“Ip Tools”并单击“Lan scanner”,您将看到网络中连接的所有其他设备,现在再次检查 ping 是否有效!