Android: 以编程方式获取路线信息

Android: get route info programmatically

我正在向远程发送 UDP 数据包,我想知道将用于此目的的本地接口的 IP。在 shell 我会 运行:

ip route get 192.168.1.54

它会这样回答:

192.168.1.12 dev wlan0  table local_network  src 192.168.1.1

我有兴趣获得 src192.168.1.1

我可以像这样调用 exec 来完成:

Runtime.getRuntime().exec("ip route get 192.168.1.54")

但这看起来不是很优雅,我不知道哪些设备支持它(它适用于其中一些设备,而其他设备return错误代码“1”,尽管该命令在 adb shell).

有没有办法用 Android SDK 做到这一点?我查看了 ConnectivityManager 但找不到方法...

使用Android的DatagramSocket应该直接给你源地址:

val socket = DatagramSocket()
val targetAddress = InetAddress.getByName(destHostOrIp)
socket.connect(targetAddress, port)
val local = socket.getLocalAddress()

您似乎需要您的 WiFi 网络的网关地址。

此函数基于doc and some examples

public InetAddress getGateway(Context context) {
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        // getActiveNetwork() requires M or later.
        return null;
    }
    Network activeNetwork = connectivityManager.getActiveNetwork();
    if (activeNetwork == null) {
        return null;
    }
    List<RouteInfo> routes = connectivityManager.getLinkProperties(activeNetwork).getRoutes();
    for (RouteInfo route : routes) {
        if (route.isDefaultRoute() && !(route.getGateway() instanceof Inet6Address)) {
           return route.getGateway();
        }
    }
    return null;
}