我试图通过编程检测,当Android手机触发此"警告"时,当前无法访问已建立的internet连接(在本例中为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时,我正在测量下载/上传速率.我将自己定位为here,猜测下载速率低于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界面来判断这一点?如果可能,我想进行avoid次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;
}

推荐答案

好了,您引用的用户体验(在连接图标上显示感叹号)是由网络能力NET_CAPABILITY_VALIDATED(link)驱动的.

指示此网络上的连接已成功

因此,在代码中,应将其更新为:

...
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
    Context.CONNECTIVITY_SERVICE);
NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
if(!nc.hasCapability(NET_CAPABILITY_VALIDATED)) {
    // Show the exclamation point
}

Java相关问答推荐

BiPredicate和如何使用它

Java事件系统通用转换为有界通配符

空手道比赛条件

取消按钮,但没有任何操作方法引发和异常

Java中如何根据Font.canDisplay方法对字符串进行分段

我找不到&Quot;配置&的位置

调用引发泛型异常的泛型方法时出现编译错误

在bash中将数组作为Java程序的参数传递

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

Spark忽略Iceberg Nessie目录

如何在Java记录中设置BigDecimal类型属性的精度?

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

将关闭拍卖的TimerService

有谁能帮我修一下这个吗?使输出变得更加整洁

错误:不兼容的类型:Double不能转换为Float

如何在EL处理器中定义带有命名空间的变量?

如何通过Java java.lang.Foreign API访问本机字节数组

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

当我try 返回可选时,Mock无法正常工作

如何显示新布局