有什么方法可以检查 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();
}
}
}
我正在制作一个 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();
}
}
}