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
我有兴趣获得 src
:192.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 网络的网关地址。
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;
}
我正在向远程发送 UDP 数据包,我想知道将用于此目的的本地接口的 IP。在 shell 我会 运行:
ip route get 192.168.1.54
它会这样回答:
192.168.1.12 dev wlan0 table local_network src 192.168.1.1
我有兴趣获得 src
:192.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 网络的网关地址。
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;
}