有没有办法检查4g网络在Android上是否稳定?

时间:2015-10-09 23:56:10

标签: android voip

我正在制作一个VoIP客户端,我想让客户端拨打连接4G时拨打的最后一个电话号码。如果用户按下"结束通话"它不会自动呼叫。按钮。只有在连接断开且用户无法按结束通话才能完成电话呼叫时才会发生这种情况。

所以我有BroadcastReceiver,它告诉我互联网连接是否可用或不是很好。 除了它告诉我太多。

我看到手机的行为是当没有网络并且它从4G网络获得连接时,onReceive(..)中的BroadcastReceiver方法被触发约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的连接。但话说回来,有一系列onVoipAvailable()onVoipNotAvailable()在4G建立后被召唤。

我的目标是找出4G是否建立得相当好。这是非常模糊的,但我不能用不同的方式来说。 : - (

我该怎么办?

1 个答案:

答案 0 :(得分:0)

在我的应用中,我确实避免重复广播。但是,我收到的序列是几个连接的#34;对于同一网络,或几个"断开连接"对于同一个网络:

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();
        }
    }
}