安卓系统是否支持网络连接?

5
我有一段代码用于测试下载某些文件前是否存在网络连接。问题是,我还在测试需要基于Web的登录表单(类似于酒店、机场甚至飞机的网络)的网络。我使用的这段代码在这种情况下完全无用。网络报告显示在这些情况下它是可用的和连接的。当然,这是个问题,因为我启动了一个异步网络连接会失败。我想知道是否有人知道我可以做什么来确保我是“真正”连接或者对这个问题有任何建议。
这是我的代码块:
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());

以下是我尝试过我的代码块并得到的结果。

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

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

我的设备开启了飞行模式
Crash: networkInfo NullPointerException

没有wifi - 没有移动数据(实际上是飞行模式)

Crash: networkInfo NullPointerException

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

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

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

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

正如您所看到的,在我有未经验证的Wifi和经过验证的Wifi的情况下,isAvailableisConnected都返回true。


确保您连接到特定站点的唯一方法是发送请求并获取响应。请根据此编写您的代码。 - user1864610
2个回答

0

检查一下这个对你有用吗。我是这样做的:

按照以下方式创建两个Java文件:

NetworkConnectivity.java

package com.connectivity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;

public class NetworkConnectivity {

    private static NetworkConnectivity sharedNetworkConnectivity = null;

    private Activity activity = null;

    private final Handler handler = new Handler();
    private Runnable runnable = null;

    private boolean stopRequested = false;
    private boolean monitorStarted = false;

    private static final int NETWORK_CONNECTION_YES = 1;
    private static final int NETWORK_CONNECTION_NO = -1;
    private static final int NETWORK_CONNECTION_UKNOWN = 0;

    private int connected = NETWORK_CONNECTION_UKNOWN;

    public static final int MONITOR_RATE_WHEN_CONNECTED_MS = 5000;
    public static final int MONITOR_RATE_WHEN_DISCONNECTED_MS = 1000;

    private final List<NetworkMonitorListener> networkMonitorListeners = new ArrayList<NetworkMonitorListener>();

    private NetworkConnectivity() {
    }

    public synchronized static NetworkConnectivity sharedNetworkConnectivity() {
        if (sharedNetworkConnectivity == null) {
            sharedNetworkConnectivity = new NetworkConnectivity();
        }

        return sharedNetworkConnectivity;
    }

    public void configure(Activity activity) {
        this.activity = activity;
    }

    public synchronized boolean startNetworkMonitor() {
        if (this.activity == null) {
            return false;
        }

        if (monitorStarted) {
            return true;
        }

        stopRequested = false;
        monitorStarted = true;

        (new Thread(new Runnable() {
            @Override
            public void run() {
                doCheckConnection();
            }
        })).start();

        return true;
    }

    public synchronized void stopNetworkMonitor() {
        stopRequested = true;
        monitorStarted = false;
    }

    public void addNetworkMonitorListener(NetworkMonitorListener l) {
        this.networkMonitorListeners.add(l);
        this.notifyNetworkMonitorListener(l);
    }

    public boolean removeNetworkMonitorListener(NetworkMonitorListener l) {
        return this.networkMonitorListeners.remove(l);
    }

    private void doCheckConnection() {

        if (stopRequested) {
            runnable = null;
            return;
        }

        final boolean connectedBool = this.isConnected();
        final int _connected = (connectedBool ? NETWORK_CONNECTION_YES
                : NETWORK_CONNECTION_NO);

        if (this.connected != _connected) {

            this.connected = _connected;

            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    notifyNetworkMonitorListeners();
                }
            });
        }

        runnable = new Runnable() {
            @Override
            public void run() {
                doCheckConnection();
            }
        };

        handler.postDelayed(runnable,
                (connectedBool ? MONITOR_RATE_WHEN_CONNECTED_MS
                        : MONITOR_RATE_WHEN_DISCONNECTED_MS));
    }

    public boolean isConnected() {
        try {
            ConnectivityManager cm = (ConnectivityManager) activity
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();

            if (netInfo != null && netInfo.isConnected()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    private void notifyNetworkMonitorListener(NetworkMonitorListener l) {
        try {
            if (this.connected == NETWORK_CONNECTION_YES) {
                l.connectionEstablished();
            } else if (this.connected == NETWORK_CONNECTION_NO) {
                l.connectionLost();
            } else {
                l.connectionCheckInProgress();
            }
        } catch (Exception e) {
        }
    }

    private void notifyNetworkMonitorListeners() {
        for (NetworkMonitorListener l : this.networkMonitorListeners) {
            this.notifyNetworkMonitorListener(l);
        }
    }

}

NetworkMonitorListener.java

package com.connectivity;

public interface NetworkMonitorListener {

    public void connectionEstablished();
    public void connectionLost();
    public void connectionCheckInProgress();
}

最后,使用方法:
NetworkConnectivity.sharedNetworkConnectivity().configure(this);
        NetworkConnectivity.sharedNetworkConnectivity().startNetworkMonitor();
        NetworkConnectivity.sharedNetworkConnectivity()
                .addNetworkMonitorListener(new NetworkMonitorListener() {
                    @Override
                    public void connectionCheckInProgress() {
                        // Okay to make UI updates (check-in-progress is rare)
                    }

                    @Override
                    public void connectionEstablished() {
                        // Okay to make UI updates -- do something now that
                        // connection is avaialble

                        Toast.makeText(getBaseContext(), "Connection established", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void connectionLost() {
                        // Okay to make UI updates -- bummer, no connection

                        Toast.makeText(getBaseContext(), "Connection lost.", Toast.LENGTH_LONG).show();
                    }
                });

通过以上使用方式,您将能够在运行时检查网络连接。一旦失去互联网连接,Toast 将会出现(根据上述代码)。

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

并使用这个

 If(WifiConnected() && hasInternetAccess()){
      //Do background Work...
    }

这怎么可能知道你是否连接到需要第二次登录的WiFi网络,比如在机场或咖啡店? - Quaker

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