簡體   English   中英

如何在 Android ICS 上檢查 VPN 連接狀態

[英]How to check VPN connection status on Android ICS

我正在嘗試注冊接收器,這將檢查 VPN 狀態。 我試過這個: 在 Android 上獲取 VPN 連接狀態,但看起來它不再適用於 ICS。 我已經檢查了 android 源代碼以獲取一些線索,但沒有運氣,只注意到在 ISC 中沒有類似的東西: vpn.connectivityconnection_state - 它vpn.connectivity在 android 2.3 中。 還嘗試使用android.net.conn.CONNECTIVITY_CHANGE作為我的IntentFilter ,但它根本不對 VPN 連接做出反應(當然我已經添加了權限android.permission.ACCESS_NETWORK_STATE )。 我認為這很簡單,但我已經沒有想法了……有人可以幫我嗎?

也許您可以嘗試輪詢 DNS 服務器更改。 如果它已更改,則 VPN 已連接。 但是,我認為這條規則可能有很多例外。

您如何獲取當前適用於 Android 的 DNS 服務器?

我的解決方案是輪詢 NIC 列表。
# 你可以通過執行命令“ls /sys/class/net”來獲取列表。

如果列表中有“tun0”,則設備已經連接到 VPN。

NetworkCapabilities在 API 21+ 中為我工作。 不幸的是,我還沒有找到 19-20 的解決方案。 您必須遍歷所有現有網絡並檢查哪個具有VPN_TRANSPORT

ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = cm.getAllNetworks();

Log.i(TAG, "Network count: " + networks.length);
for(int i = 0; i < networks.length; i++) {

  NetworkCapabilities caps = cm.getNetworkCapabilities(networks[i]);

  Log.i(TAG, "Network " + i + ": " + networks[i].toString());
  Log.i(TAG, "VPN transport is: " + caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN));
  Log.i(TAG, "NOT_VPN capability is: " + caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN));

}
for (Enumeration<NetworkInterface> en =
             NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            if (intf.getName().contains("tun0") || intf.getName().contains("ppp0")) {
                vpnInterface = intf;
                break;
            }
        }

對於 VPN 網絡接口

for (Enumeration<InetAddress> en =
                 vpnInterface.getInetAddresses(); en.hasMoreElements(); ) {
                InetAddress address = en.nextElement();
                if (!address.isLoopbackAddress()) {
                    String ip = address.getHostAddress();
                    break;
                }
            }

和 InetAddress

這就是我現在所知道的一切

檢查它是否已啟動等。也許

if (vpnInterface.isUp())

我確實實現了一個代碼,它在一段時間后調用自己並向 ApplicationHandlers 發送消息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM