安卓网络连接失败

3
我正在使用以下代码来识别手机是否连接到互联网。
public static boolean isOnline(Context context) {  
    try {
        ConnectivityManager cm = (ConnectivityManager) 
        context.getSystemService(Context.CONNECTIVITY_SERVICE);  
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();
    } catch(Exception e) {
        return false;
    }
}

使用这种检查方式,当手机连接家庭WiFi但注意到没有互联网连接时,此方法仍会返回true。这导致我的应用程序崩溃,因为它在假定有互联网的情况下执行代码。我可以添加更多的异常处理来防止崩溃,但我需要一种更好的检查互联网连接状态的方式,该方式可以返回实际的互联网连接状态...

4个回答

0
请使用这个:
public  boolean isConnected() {
        boolean conectado;
        if (conectivtyManager.getActiveNetworkInfo() != null
                && conectivtyManager.getActiveNetworkInfo().isAvailable()
                && conectivtyManager.getActiveNetworkInfo().isConnected()) {
            conectado = true;
        } else {
            conectado = false;
        }
        return conectado;
    }

将此权限放置于:

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

不要忘记权限,检查漫游也是个好主意。请参考我的答案。 - Timmetje
我已经添加了权限...当我在手机上关闭Wi-Fi时,它会告诉我没有互联网,但是当我重新连接时,尽管没有互联网,它也会说有。 - Amol
@AmolKamble 使用这个方法,不要忘记放置权限,它应该可以工作。 - Guilherme Gregores
如果我连接到Wi-Fi并形成内部网络,这种方法会受到影响吗? - Amol
我不确定,但是我认为这应该不是个问题。 - Guilherme Gregores

0

我经常使用:

public static boolean isOnline(Context ctx) {

    NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
    if (info == null || !info.isConnected()) {
        return false;
    }
    if (info.isRoaming()) {
        // here is the roaming option you can change it if you want to
        // disable internet while roaming, just return false
        return false;
    }
    return true;
}

如果设备正在漫游,会进行额外的检查,当值为true时,这表明在此网络上使用数据可能会产生额外费用。

不要忘记将正确的权限添加到<application>标签之外的清单中:

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

我认为漫游不是问题。无论如何,我尝试了你的方法,但没有成功。 - Amol
你可能想要发布你的DDMS日志。这应该有效。你添加了权限吗? - Timmetje
已添加<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - Amol
我们没有日志,所以无法帮助您,因为它应该可以工作。代码没有问题。 - Timmetje

0
这对我有用:
public boolean networkCheckIn(){
try{

ConnectivityManager networkInfo = (ConnectivityManager) getSystemService(MapViewActivity.CONNECTIVITY_SERVICE) ;
networkInfo.getActiveNetworkInfo().isConnectedOrConnecting() ;

Log.d("1", "Net avail:"
                + networkInfo.getActiveNetworkInfo().isConnectedOrConnecting());

ConnectivityManager cm = (ConnectivityManager) getSystemService(MapViewActivity.CONNECTIVITY_SERVICE);
 NetworkInfo netInfo = cm.getActiveNetworkInfo();
 if (netInfo != null && netInfo.isConnectedOrConnecting()) {
    //Log.d("2", "Network available:true");
     return true;

  } else {
            //Log.d("3", "Network available:false");
            return false;
   }

}catch(Exception e){
        return false ;
}
}

0

你的问题在于方法getActiveNetworkInfo()

举个例子,获取Wi-Fi网络状态:

public static boolean isWifiAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null)
        return false;

    NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
    for (NetworkInfo ni : networkInfos) {
        if (ni.getType() == ConnectivityManager.TYPE_WIFI && ni.isConnected())
            return true;
    }
    return false;
}// isWifiAvailable()

ConnectivityManager 中有更多类型(它们以 TYPE_* 开头)。


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