ANDROID:如果WiFi已启用且处于活动状态,则启动意图

时间:2009-11-28 07:16:39

标签: android wifi internet-connection

这就是我想做的事情:

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

=&GT;如果没有,那么我会启动另一个意图,以便我不显示WebView“网页不可用...... http://www.mywebsite.com的网页可能暂时关闭或者它可能已经移动......”< / p>

我最初想要使用

如果(wifi.isWifiEnabled())

但是没有说明Wifi连接是否为ACTIVE。它只表示用户已打开开关。设备可能连接也可能没有连接......这是正确的吗?

然后我尝试使用:

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等...

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:20)

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

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意图,否则,您将永远不会收到有关您在线的通知。

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

答案 1 :(得分:8)

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

答案 2 :(得分: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连接,你可以检查文件中的其余部分

答案 3 :(得分: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>

答案 4 :(得分: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