有什么方法可以检查 Android 上 4g 网络是否稳定?

Is there any way to check if 4g network is stabilized on Android?

我正在制作一个 VoIP 客户端,我想让客户端在连接 4G 时呼叫它正在通话的最后一个 phone 号码。如果用户按下 "end call" 按钮,它不会自动调用。只有当连接断开并且用户无法按结束呼叫来完成 phone 呼叫时才会发生。

所以我有一个 BroadcastReceiver,它会告诉我互联网连接是否可用。 除了它告诉我太多了。

我看到的phone的行为是在没有网络的情况下,它从4G网络获取连接,BroadcastReceiver中的onReceive(..)方法被触发了大约8次,[已连接,未连接,已连接,未连接,....,已连接]。

这是侦听连接的代码。

@Override
public void onReceive( Context context, Intent intent ) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    NetworkInfo an = cm.getActiveNetworkInfo();

    if ( an != null ) {
        // this method just decides if it is WIFI or fast network like
        // 4G or HSPAP. 
        state = updateConnectionAvailability(context, an, tm);

        // 1: 4G/HSPAP, 3: WIFI
        if (state == 1 || state == 3) {
            Toast.makeText( context, "Fast network available", Toast.LENGTH_SHORT ).show();
        } else {
            Toast.makeText( context, "Warning: Slow network available", Toast.LENGTH_SHORT ).show();
        }

        if (mCCL != null) {
            mCCL.onVoipAvailable();
        }
    } else {
        Toast.makeText( context, "There is no Internet connection!", Toast.LENGTH_SHORT).show();
        if (mCCL != null) {
            mCCL.onVoipNotAvailable();
        }
    }
}

您可能已经注意到,我创建了一个自定义监听器 mCCL。它只是通知与 MainActivity 的连接。但是话又说回来,一旦建立了 4G,就会调用一系列 onVoipAvailable()onVoipNotAvailable()

我的目标是看看 4G 是否建立得很好。这是非常模糊的,但我不能用不同的方式来表达。 :-(

我该怎么办?

在我的应用程序中,我确实避免重复广播。但是,我收到的序列是同一个网络的几个"connected",或者同一个网络的几个"disconnected":

public NetworkInfo previous_network = null;

@Override
public void onReceive( Context context, Intent intent ) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    NetworkInfo an = cm.getActiveNetworkInfo();

    ///AVOID EXTRA BROADCAST
    if (previous_network == null && an==null) {
        Log.i(mTag, "detected duplicate broadcast - no network");
        return;
    }
    if (previous_network != null && an != null) {
        if (an.toString().compareTo(previous_network.toString()) == 0) {
            Log.i(mTag, "detected duplicate broadcast - no change");
            return;
        }
    }
    previous_network = an;
    ///END OF AVOID EXTRA BROADCAST

    if ( an != null ) {
        // this method just decides if it is WIFI or fast network like
        // 4G or HSPAP. 
        state = updateConnectionAvailability(context, an, tm);

        // 1: 4G/HSPAP, 3: WIFI
        if (state == 1 || state == 3) {
            Toast.makeText( context, "Fast network available", Toast.LENGTH_SHORT ).show();
        } else {
            Toast.makeText( context, "Warning: Slow network available", Toast.LENGTH_SHORT ).show();
        }

        if (mCCL != null) {
            mCCL.onVoipAvailable();
        }
    } else {
        Toast.makeText( context, "There is no Internet connection!", Toast.LENGTH_SHORT).show();
        if (mCCL != null) {
            mCCL.onVoipNotAvailable();
        }
    }
}