15

这就是我想做的:

=> 如果 WiFi 已启用并处于活动状态,则启动一个意图(实际上它是一个获取其内容的 WebView =>我的应用程序在网络上的说明)

=> 如果不是,那么我将启动另一个意图,这样我就不会显示带有“网页不可用...的 Web 视图” http://www.mywebsite.com的网页可能暂时关闭,或者它可能有感动了……”

我最初坚持使用

如果(wifi.isWifiEnabled())

但这并不能说明 Wifi 连接是否处于活动状态。它只说用户打开了开关。该设备可能已连接或未连接...这是正确的吗?

然后我尝试使用:

if (wifi.getConnectionInfo().getSSID()!= null)

但我注意到即使连接丢失或被禁用,它也会返回一个字符串......?

那我该怎么办?

wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
Intent intent_instructions;

            if (wifi.getConnectionInfo().getSSID()!= null){
                Log.i("Hub", "WiFi is enabled AND active !");
                Log.i("Hub", "SSID = "+wifi.getConnectionInfo().getSSID());
                intent_instructions = new Intent(this, Instructions.class);
            }else{
                Log.i("Hub", "NO WiFi");
                intent_instructions = new Intent(this, Instructions_No_WiFi.class);
            }
            this.startActivity(intent_instructions);

是否有更通用的方法可以在启动意图之前测试设备是否已连接到互联网?无论是通过 Wifi、3G 等...

在此先感谢您的帮助。

4

5 回答 5

21

您可以使用以下代码检查连接性:

private static boolean isConnected(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = null;
    if (connectivityManager != null) {
        networkInfo =
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    }
    return networkInfo == null ? false : networkInfo.isConnected();
}

请确保您已在 Manifest 中注册了 android.net.conn.CONNECTIVITY_CHANGE Intent,否则,您将永远不会收到在线通知。

过去几天我一直在努力解决这个问题,我现在才意识到我需要注册 CONNECTIVITY_CHANGE 而不仅仅是 WIFI_STATE_CHANGED。

于 2011-07-01T23:04:19.707 回答
8

尝试android.net.ConnectivityManager.getActiveNetworkInfo():如果它返回null你没有连接;如果它返回一个NetworkInfo对象,您可以使用 来检查连接的状态NetworkInfo.getState(),如果是,NetworkInfo.State.CONNECTED那么您已连接,否则您没有。

于 2010-02-26T12:56:28.087 回答
5

你可以这样做:

  @Override
  public void onReceive(Context context, Intent intent) {

  String action = intent.getAction();

        if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){

         Log.d("WIFI", "WIFI has changed");
         int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
         Log.d("WIFI", "WIFI State = " + wifiState);
         setCurrentWifiState(wifiState);

         }  

您将获得 0,1,2,3,具体取决于 Wifi 所处的状态,例如 2 正在连接,您可以查看文档中的其余部分

于 2010-02-17T14:11:05.013 回答
2

在您的 BroadcastReceiver 类中:

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){                
        boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
        if (connected){
            // start your service here
        }
    }                   
}

并在您的 AndroidManifest.xml 中确保您注册了 android.net.wifi.supplicant.CONNECTION_CHANGE 广播意图。

<intent-filter >    
    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
</intent-filter>
于 2012-07-17T15:17:27.467 回答
0

isConnected()不完全正常,研究其他东西

final ConnectivityManager connMgr = (ConnectivityManager)
        this.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi =
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    final android.net.NetworkInfo mobile =
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if( wifi.isAvailable() && wifi.getDetailedState() == DetailedState.CONNECTED){
        Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show();
    }
    else if( mobile.isAvailable() && mobile.getDetailedState() == DetailedState.CONNECTED ){
        Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show();
    }
    else
    {   
        Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show();
    }

此代码检查您是否使用 wifi 或 3g 或什么都没有,如果 wifi 打开但未连接到网络或 3g 有信号问题,它会检测此详细信息,DetailedStates

于 2012-12-07T18:26:11.643 回答