代码之家  ›  专栏  ›  技术社区  ›  K.Os

如何检测WiFi连接但没有互联网(感叹号)

  •  -1
  • K.Os  · 技术社区  · 7 年前

    当连接到WiFi时,我想自己复制状态栏行为。

    我已经注册了一个接收器,但我不知道我应该听什么样的确切动作才能检测到我是否连接到WiFi AP,但它没有互联网连接(热点断开)。

    我试着:

     override fun onReceive(context: Context, intent: Intent) {
      val wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, DEFAULT_WIFI_STATE_VALUE)
      wifiStateSubject.onNext(wifiState)
      Timber.d("Current wifi state: $wifiState")
    }
    

    但是当我连接到与网络断开连接的热点时,它并没有得到任何有价值的信息。

    我想能够检测和显示感叹号我自己当我连接到无线AP,但没有互联网连接。

    是否有具体的行动,我应该注册我的接收器使用 WiFiManager 行动?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Wale    7 年前

    我可能会在这里使用这种方法!

    public boolean isOnline() {
        try {
            int timeoutMs = 1500;
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
    
            sock.connect(sockaddr, timeoutMs);
            sock.close();
    
            return true;
        } catch (IOException e) { return false; }
    }
    
        2
  •  -1
  •   Zarea    7 年前

    首先,您必须创建广播接收器:

    public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        isInternetAvailable();
    }
    private boolean isInternetAvailable() {
        try {
            return (Runtime.getRuntime().exec("ping -c 1 google.com").waitFor() == 0);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return false;
    }
    

    }

    然后你必须在舱单上登记:

    <receiver android:name=".NetworkChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
    

    最后,您必须在主应用程序中注册:

    public class MainApplication extends MultiDexApplication {
    @Override
    public void onCreate() {
    NetworkChangeReceiver myReceiver = new NetworkChangeReceiver();
        registerReceiver(myReceiver, filter);
    }
    }
    

    所以现在,无论何时连接到WIFI,您都将收到广播,并且从isInternetAvailable()您将知道您是否连接到internet。

    不要忘记权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />