Android 如何检测已连接WiFi但未连接internet(感叹号)

Android 如何检测已连接WiFi但未连接internet(感叹号),android,kotlin,android-wifi,Android,Kotlin,Android Wifi,我想在连接到WiFi时自己复制状态栏行为 我已经注册了一个接收器,但我不知道我应该听什么样的确切动作才能检测到我是否连接到WiFi AP,但它没有互联网连接(热点断开) 我试着: override fun onReceive(context: Context, intent: Intent) { val wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, DEFAULT_WIFI_STATE_VALUE) wifiS

我想在连接到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")
}
但是,当我连接到与网络断开连接的热点时,它没有给我任何有价值的信息

当我连接到WiFi AP,但没有互联网连接时,我希望能够自己检测并显示感叹号。


我是否应该使用
WiFiManager
action向我的接收者注册一个特定的操作?

我可能会在这里使用这个方法

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

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

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>
因此,现在,无论何时连接到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" />


答案就在这里!首先,我想知道在我必须自己实现它之前,是否有一些API正在这样做查看此链接以获得几个答案,说明如何设置
BroadcastReceiver
以及
NetworkInfo
来通知您连接状态的任何更改::这是一个可以调用一次的方法-我想对此作出反应仅当我连接到WiFi但没有互联网连接时才更改您的观点是什么?你想对你所连接的没有互联网接入的Wifi做出反应吗???您首先需要代码来检查您是否已连接?因为如果您已连接到wifi或手机!然后你可以在你喜欢的时间做检查!如果你有或没有互联网接入,它会简单地返回!如果我遗漏了什么,请解释一下!。重点是我不想检查接入点是否有互联网连接,所以你这句话的第二部分不是我要找的。我希望在连接到wifi时能够接收状态,但AP刚刚失去互联网连接并对此做出反应(例如在Android状态栏上显示感叹号),我希望相信有一个api可以做到这一点!你不明白我的问题
<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" />