Android中的网络是否可用?

EGH*_*HDK 5 java authentication networking android android-networking

在我开始下载某些文件之前,我有这个代码块用于测试是否存在网络连接.我遇到的问题是我也在需要基于网络登录表格的网络上进行测试(类似于酒店,机场甚至飞机).我正在使用的这段代码对于这种情况完全没用.网络报告它isAvailableisConnected在这些情况下.这当然是个问题,因为我启动了失败的异步网络连接.我想知道是否有人知道我能做些什么来确保我"真正"联系,或者如果有人对这个问题有任何建议.

这是我的代码块:

ConnectivityManager manager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();

Log.e("", "Network info: "+networkInfo+" toString?: "+networkInfo.toString());
Log.e("", "getTypeName: "+networkInfo.getTypeName());
Log.e("", "isAvailable: "+networkInfo.isAvailable());
Log.e("", "isConnected: "+networkInfo.isConnected());
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过我的代码块和结果的用例.

Verizon的1x信号

Network info: NetworkInfo: type: mobile[CDMA - 1xRTT], state: CONNECTED/CONNECTED, reason: connected, extra: , roaming: false, failover: true, isAvailable: true, isConnectedToProvisioningNetwork: false 

toString?: NetworkInfo: type: mobile[CDMA - 1xRTT], state: CONNECTED/CONNECTED, reason: connected, extra: , roaming: false, failover: true, isAvailable: true, isConnectedToProvisioningNetwork: false

getTypeName: mobile
isAvailable: true
isConnected: true
Run Code Online (Sandbox Code Playgroud)

Verizon的3G信号

 Network info: NetworkInfo: type: mobile[CDMA - eHRPD], state: CONNECTED/CONNECTED, reason: linkPropertiesChanged, extra: VZWINTERNET, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false

 toString?: NetworkInfo: type: mobile[CDMA - eHRPD], state: CONNECTED/CONNECTED, reason: linkPropertiesChanged, extra: VZWINTERNET, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false

 getTypeName: mobile
 isAvailable: true
 isConnected: true
Run Code Online (Sandbox Code Playgroud)

我的设备上的飞行模式

Crash: networkInfo NullPointerException
Run Code Online (Sandbox Code Playgroud)

没有wifi - 没有移动数据(有效的飞行模式)

Crash: networkInfo NullPointerException
Run Code Online (Sandbox Code Playgroud)

WiFi(未经过身份验证):

Network info: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true 

toString: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true

getTypeName: WIFI
isAvailable: true
isConnected: true
Run Code Online (Sandbox Code Playgroud)

WiFi(未经过身份验证)第二台设备:

Network info: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "myWifi", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false 

toString?: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "myWifi", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false

getTypeName: WIFI
isAvailable: true
isConnected: true
Run Code Online (Sandbox Code Playgroud)

WiFi(已通过身份验证)

Network info: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true 

toString?: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true

getTypeName: WIFI
isAvailable: true
isConnected: true
Run Code Online (Sandbox Code Playgroud)

WiFi(认证)第二设备:

Network info: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "myWifi", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false 

toString?: NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "myWifi", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false

getTypeName: WIFI
isAvailable: true
isConnected: true
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我得到真正的isAvailableisConnected在那里我有没有认证的无线网络连接和认证无线上网的情况.

sac*_*n10 -1

尝试这个:-

   private boolean hasInternetAccess() {
        boolean hasInternetAccess = false;
        try {
                //I set google but you can try anything "reliable"...
                //isReachable(1) the timeout in seconds
            hasInternetAccess = InetAddress.getByName("www.google.com").isReachable(1);                         

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return hasInternetAccess;
    }
Run Code Online (Sandbox Code Playgroud)

并使用这个

 If(WifiConnected() && hasInternetAccess()){
      //Do background Work...
    }
Run Code Online (Sandbox Code Playgroud)