安卓:如果WiFi已启用并处于活动状态,则启动一个意图。

15

我想要实现的功能是:

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

=> 如果没有,则我将启动另一个意图,以便我不会显示带有“网页不可用...网页http://www.mywebsite.com可能暂时关闭或已移动...”的WebView

我最初考虑使用

if (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);

在启动一个intent之前,有没有一种更通用的方法来测试设备是否通过Wifi、3G等连接到互联网的方式?

提前感谢你的帮助。


WIFI_STAT_ENABLED 只是表示 WIFI 无线电已打开。这与您是否实际连接到访问点无关。 - user233357
1
确实,那么你有什么建议? - Hubert
可能是 如何在安卓中检查 WiFi 是否已连接 的重复问题。 - Ciro Santilli OurBigBook.com
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();
}
请确保您已在清单文件中注册了android.net.conn.CONNECTIVITY_CHANGE意图,否则,您将永远无法收到有关联网状态的通知。
我最近几天一直在解决这个问题,现在我才意识到我需要注册CONNECTIVITY_CHANGE而不仅仅是WIFI_STATE_CHANGED。

将这个方法命名为 isConnectedViaWiFi 不是更合适/正确吗? - ban-geoengineering

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

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

         }  

根据Wifi处于哪种状态,您将得到0、1、2或3,例如2表示正在连接,其余内容请参阅文档。


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>

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进行处理。


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