在Android中检测网络连接的问题

4

我使用Google Maps创建了一个Android应用程序。现在我想检查是否有可用的互联网连接。我在Google上搜索,最终通过Stackoverflow找到了解决方案:

boolean HaveConnectedWifi = false;
boolean HaveConnectedMobile = false;
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo)
    {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                HaveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                HaveConnectedMobile = true;
    }
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />   

我已经编写了在线Google地图代码,如果返回true则为在线代码,否则为离线代码。
我的问题是即使没有网络连接,它仍然显示有可用的网络连接。我在哪里犯了错误?
2个回答

12
尝试使用NetworkInfo ni = cm.getActiveNetworkInfo();替代NetworkInfo ni = cm.getAllNetworkInfo();。任何时候应该只有一个活动的数据网络,因为Android将使用最佳可用选项并关闭其他网络以节省电池电量。

另外,我倾向于使用ni.isConnectedOrConnecting();而不是ni.isConnected();,因为它可以更好地捕捉过渡状态。

我还使用ni.getType() == ConnectivityManager.TYPE_WIFI替代ni.getTypeName().equalsIgnoreCase("WIFI"),因为比较两个int值比比较两个字符串更有效率。

以下代码适用于我:

boolean HaveConnectedWifi = false;
boolean HaveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if ( ni != null )
{
    if (ni.getType() == ConnectivityManager.TYPE_WIFI)
        if (ni.isConnectedOrConnecting())
            HaveConnectedWifi = true;
    if (ni.getType() == ConnectivityManager.TYPE_MOBILE)
        if (ni.isConnectedOrConnecting())
            HaveConnectedMobile = true;
}

现在异常问题已经解决了,但是我有一个疑问:当我将设备/模拟器设置为飞行模式时,它会断开所有无线连接,并且无法检测到连接。所以现在的问题是,当有可用的互联网连接时,它显示为假,并且无法检测到互联网连接。你能否详细解释一下? - deepa
飞行模式将关闭设备中的所有无线电:移动、WiFi和蓝牙。在飞行模式处于活动状态时,无法使用它们。 - Mark Allison
那么如何检测互联网连接是否可用?当互联网连接可用时一切正常,但当它不可用时,它返回true但谷歌地图没有加载,只显示网格。请帮帮我,这非常紧急。我需要发布我的应用程序。 - deepa
你不能在没有网络连接的情况下使用地图,因此你无法在飞行模式或锁定网络连接时使用地图。 - Mark Allison
是的,当我的设备/模拟器不处于飞行模式时,它也不能正确检测到互联网连接。在模拟器中,它始终对移动网络返回true...当它返回true时,仅显示网格而不是地图,如果没有可用的互联网连接。如何解决这个问题? - deepa
显示剩余8条评论

0
/**
 * Checking whether net connection is available or not.
 * 
 * @param nContext
 * @return true if net connection is avaible otherwise false
 */
public static boolean isNetworkAvailable(Context nContext) {
    boolean isNetAvailable = false;
    if (nContext != null) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) nContext
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (mConnectivityManager != null) {
            boolean mobileNetwork = false;
            boolean wifiNetwork = false;
            boolean mobileNetworkConnecetd = false;
            boolean wifiNetworkConnecetd = false;
            NetworkInfo mobileInfo = mConnectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            NetworkInfo wifiInfo = mConnectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mobileInfo != null)
                mobileNetwork = mobileInfo.isAvailable();
            if (wifiInfo != null)
                wifiNetwork = wifiInfo.isAvailable();
            if (wifiNetwork == true || mobileNetwork == true) {
                if (mobileInfo != null)
                    mobileNetworkConnecetd = mobileInfo
                            .isConnectedOrConnecting();
                wifiNetworkConnecetd = wifiInfo.isConnectedOrConnecting();
            }
            isNetAvailable = (mobileNetworkConnecetd || wifiNetworkConnecetd);
        }
    }
    return isNetAvailable;

}

还需要在清单文件中添加以下权限标签:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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