【问题标题】:ANDROID: if WiFi is enabled AND active, launch an intentANDROID:如果 WiFi 已启用且处于活动状态,则启动意图
【发布时间】:2009-11-28 07:16:38
【问题描述】:

这就是我想做的:

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

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

我最初坚持使用

如果(wifi.isWifiEnabled())

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

然后我尝试使用:

如果 (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 等...

提前感谢您的帮助。

【问题讨论】:

标签: android wifi internet-connection


【解决方案1】:

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

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。

【讨论】:

  • 把这个方法命名为isConnectedViaWiFi不是更合适/正确吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以这样做:

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

    根据 Wifi 所处的状态,你会得到 0,1,2,3,所以例如 2 正在连接,你可以查看文档中的其余部分

    【讨论】:

      【解决方案4】:

      在您的 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>
      

      【讨论】:

        【解决方案5】:

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 2017-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多