检查 Android 中的 *** 连接是不是处于活动状态?

Posted

技术标签:

【中文标题】检查 Android 中的 *** 连接是不是处于活动状态?【英文标题】:Check if a *** connection is active in Android?检查 Android 中的 *** 连接是否处于活动状态? 【发布时间】:2015-04-07 19:43:48 【问题描述】:

我在我的无根 android 4.4 设备上安装了第三方 *** 应用,并且想编写一个后台服务来监控 *** 连接并在 *** 连接中断时提醒用户。

有没有办法做到这一点?我找不到任何使用 ***Service API 的方法。

谢谢-D

【问题讨论】:

【参考方案1】:

迟到的答案,在 Android 上测试16 <-> 29

public boolean ***() 
    String iface = "";
    try 
        for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) 
            if (networkInterface.isUp())
                iface = networkInterface.getName();
                Log.d("DEBUG", "IFACE NAME: " + iface);
            if ( iface.contains("tun") || iface.contains("ppp") || iface.contains("pptp")) 
                return true;
            
        
     catch (SocketException e1) 
        e1.printStackTrace();
    

    return false;


上述内容不适用于wireguard,因为接口名称可以是任何名称(通常是连接名称)。

【讨论】:

【参考方案2】:

我为自己编写了一个支持 API 21 及更高版本的辅助函数。

public static boolean ***Active(Context context)

        //this method doesn't work below API 21
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
            return false;

        boolean ***InUse = false;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);


        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) 

            Network activeNetwork = connectivityManager.getActiveNetwork();
            NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);

            return caps.hasTransport(NetworkCapabilities.TRANSPORT_***);
        

        Network[] networks = connectivityManager.getAllNetworks();

        for(int i = 0; i < networks.length; i++) 

            NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(networks[i]);
        if(caps.hasTransport(NetworkCapabilities.TRANSPORT_***)) 
            ***InUse = true;
            break;
        
    

    return ***InUse;

【讨论】:

【参考方案3】:

这对我有用: 从 API 16 到 23 测试:

List<String> networkList = new ArrayList<>();
try 
    for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) 
        if (networkInterface.isUp())
            networkList.add(networkInterface.getName());
    
 catch (Exception ex) 
    Timber.d("is***Using Network List didn't received");


return networkList.contains("tun0");

附:它也可以是另一个名为“ppp0”的网络接口,但在我对不同 *** 应用程序的测试中,它始终是“tun0”

【讨论】:

这种变化。例如,在使用 Open*** 时,它会显示 tunX,其中 X 有时是递增的 id。使用 PPTP 时,使用的接口是 pptpX,其中 X 也是一个从 0 开始的 id。【参考方案4】:

检查活动网络是否正在使用 *** 的替代方法:

Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean ***InUse = caps.hasTransport(NetworkCapabilities.TRANSPORT_***);

【讨论】:

这是真正回答问题的内容。应该检查活动网络,而不是遍历所有网络。关键是要知道设备是否真的在使用 *** 主动连接【参考方案5】:

查看网络信息怎么样?如果一个人有一种 ***,我会假设有一个 *** 连接。

需要 ACCESS_NETWORK_STATE 权限。

            List<NetworkInfo> connectedNetworks    = new ArrayList<>();

        if (Build.VERSION.SDK_INT >= 21)
            
            Network[] networks = m_ConnectivityManager.getAllNetworks();

            for (Network n : networks)
                
                NetworkInfo ni = m_ConnectivityManager.getNetworkInfo(n);

                if (ni.isConnectedOrConnecting())
                    
                    connectedNetworks.add(ni);
                    
                
            
        else
            
            NetworkInfo[] nis = m_ConnectivityManager.getAllNetworkInfo();

            for (NetworkInfo ni : nis)
                
                if (ni.isConnectedOrConnecting())
                    
                    connectedNetworks.add(ni);
                    
                
            

        boolean bHas*** = false;

        if (Build.VERSION.SDK_INT >= 21)
            
            for (NetworkInfo ni : connectedNetworks)
                
                bHas*** |= (ni.getType() == ConnectivityManager.TYPE_***);
                
            

【讨论】:

【参考方案6】:

使用NetworkCapabilities 对我有用。您必须遍历所有现有网络并检查哪个有 ***_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, "*** transport is: " + caps.hasTransport(NetworkCapabilities.TRANSPORT_***));
  Log.i(TAG, "NOT_*** capability is: " + caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_***));


【讨论】:

ConnectivityManager.getAllNetworks() 仅在 API 级别 21 Lollipop 中可用。 @Isaac Madwed 您现在有办法对 API 15 级冰淇淋三明治 及以上级别进行检查吗? 不幸的是不是@vovahost。我的团队也有兴趣支持这些版本的 android,所以如果我们解决了问题,我会编辑我的帖子。 你怎么知道哪个是活跃的? @NickF 您可以在 API 23+ 上使用 getActiveNetwork()。在 API 21 和 22 上,如果任何网络有 ***,我认为 *** 已连接。【参考方案7】:

编写一个点击内部页面或 ping 内部站点的小应用程序...

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(internal_url);
HttpResponse response = client.execute(request);

String html = "";
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null)

    str.append(line);

in.close();
html = str.toString();

String str = "";
try 

    Process process = Runtime.getRuntime().exec(
            "/system/bin/ping -c 8 " + internal_url);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            process.getInputStream()));
    int i;
    char[] buffer = new char[4096];
    StringBuffer output = new StringBuffer();
    while ((i = reader.read(buffer)) > 0)
        output.append(buffer, 0, i);
    reader.close();


    str = output.toString();

 
catch (IOException e)


    e.printStackTrace();

return str;

【讨论】:

谢谢,斯图尔特。这会起作用,但我正在寻找不需要 ping 后端服务的东西。 Android 是否会根据 *** 状态发送任何系统范围的广播? @user714122 ***Service prepare() (developer.android.com/reference/android/net/***Service.html) 可能可以在这里使用,但更多的是用于建立 *** 连接

以上是关于检查 Android 中的 *** 连接是不是处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中检查3g是不是处于活动状态

检查蓝牙是不是在 Android 上处于活动状态?

使用连接池后返回连接时如何检查连接是不是处于活动状态?

您能否以编程方式检查以确定您的 android 设备是不是处于深度睡眠模式?

在整个应用程序中检查 android studio 中的互联网连接。 (我们是不是需要在每个 java 活动中编写连接管理器函数?) [重复]

有啥方法可以访问 Android 中的手电筒灯状态。我想以编程方式检查闪光灯是处于开启状态还是关闭状态