确定Android VPN接口/IP地址?

5
我正在尝试确定安卓系统中PPTP VPN接口的名称,以便在我的应用程序中将其列为可绑定接口。由于安卓系统没有VPN API可以实现这一点,我想我可以使用纯Java来找到它。
当我使用标准的Java代码获取接口列表时,例如:
ArrayList<NetworkInterface>  allInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces());

我看到了一些有趣的事情:

当手机连接802.11X Wifi时

  • tiwlan0(wifi接口)
  • ppp0(VPN)

当手机只连接Verizon时

  • ppp0(VPN,通常为此)
  • ppp1(VZ网络,通常为此)

所以 - 我需要一种方法来消除VZ接口。您可以通过Android API获取NetworkInfo对象,如下所示:

ConnectivityManager conMan = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] infoList = conMan.getAllNetworkInfo(); 

这种方法存在一些问题:

  • VPN不会显示
  • 网络信息对象中的名称/字段与Java NetworkInterface对象中的任何内容都不对应

我认为有几种方法可以从所有接口列表中消除VZ接口:

  1. 按名称(即,如果Android给了我一个包含“ppp1”的列表,我可以消除ppp1,因为Android列表永远不包含VPN)
  2. 按IP(即,如果我能找出VZ IP地址,则可以使用Java的NetworkInterface对象消除具有该IP的接口。)

不幸的是,似乎这两个选项都不可能,因为名称不匹配,而且我无法弄清楚如何从Android OS获取VZ IP。

那么,还有其他人尝试过类似的事情吗?是否有一些方法可以询问Android OS哪些接口具有IP地址?

提前感谢您的帮助。

Dan

附:我正在尝试避免强制用户输入有效的IP范围(或特定IP)来绑定。

2个回答

1

编辑:这里有一个可能的选项,就是使用Android本地工具包进行JNI系统调用。读取/dev/目录列表并grep ppp*。假设最早的是3G/4G连接,后面的是VPN。


那种方式与我发布的Java方式有什么不同?问题在于我需要找到移动接口并将其从选择列表中删除。您是否在说JNI方式会产生一些主机名/接口名,表明是“移动设备”? - debracey
@debracey 好的,现在我明白你要找什么了。在这种情况下,另一个想法是查看/dev/ppp0和ppp1的时间戳。在有两个接口的情况下,较早的应该是移动3g / 4g设备,而后者是vpn dev。拥有三个设备(wifi / 3g和vpn)会使这更具挑战性,但可能不太可能。 - ajpyles
当你打开wifi时,Android会关闭3G连接,所以你实际上不能同时使用wifi和移动网络。我需要研究一下你的想法——你知道这是否需要手机root权限吗? - debracey
好的,我不知道WiFi和3G之间的互斥性!它不需要root访问,只需要从JNI执行类似于“ls -l /dev”的命令。 - ajpyles

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接