在Android中收到网络连接警告

4
我试图以编程方式检测 Android 手机触发此“警告”时,已建立的互联网连接当前似乎无法访问(在此情况下:Edge/2G),如下所示:Connection warning事实上,当出现此警告时,互联网无法访问,而没有警告时,可以正常访问。我目前正在做的是检测正确的网络。
public String getNetworkClass() {

    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
        return "Unknown";
    } else {
        int networkType = mTelephonyManager.getNetworkType();
        Log.i("NETWORK", String.valueOf(networkType));
        mobileNetworkType = networkType;

        switch (networkType) {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                return "2G";
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                return "3G";
            case TelephonyManager.NETWORK_TYPE_LTE:
                return "4G";
            case TelephonyManager.NETWORK_TYPE_NR:
                return "5G";
            default:
                return "Unknown";
        }
    }
}

当网速为2G时,我正在测量下载/上传速率。我参考这里的建议,猜测下载速率低于150 kbps可能会导致该“警告”:

if(Arrays.asList(new String[]{"2G"}).contains(getNetworkClass())) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
    int downSpeed = nc.getLinkDownstreamBandwidthKbps();
    int upSpeed = nc.getLinkUpstreamBandwidthKbps();
    

    if(downSpeed < 150) {
        // I assume the connection is bad here                            
    } else {
        // All fine!
    }

然而,我的测量值在每五秒钟之间在30到100 kbps之间波动,有时在这个范围内出现警告,有时则没有。

我该如何成功地捕获这个问题?是否有Android接口可以检查此问题?如果可能,我想要避免像ping检查这样的操作:

public boolean canAccessInternet() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        System.out.println("Network mExitValue " + exitValue);
        return (exitValue == 0);
    } catch (IOException e) {
        System.out.println(" IO Error ");
        e.printStackTrace();
    } catch (InterruptedException e) {
        System.out.println(" Interrupted Error ");
        e.printStackTrace();
    }
    return false;
}
1个回答

1
据我所知,你提到的带有感叹号的连接图标的用户体验是由网络能力NET_CAPABILITY_VALIDATED驱动的(链接:link)。

表示在该网络上的连接已成功验证。例如,对于具有NET_CAPABILITY_INTERNET的网络,这意味着已成功检测到Internet连接。

因此,在您的代码中,您需要将其更新为以下内容:
...
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
    Context.CONNECTIVITY_SERVICE);
NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
if(!nc.hasCapability(NET_CAPABILITY_VALIDATED)) {
    // Show the exclamation point
}

1
确实很有帮助,谢谢!进一步的调查表明,如果特别是在刚刚启用移动互联网时,它会经常发生,但有时也会在中途发生。加上我的速度测量结果,现在是一个不错的结果! - Gary Klasen

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