【问题标题】:How to detect WiFi connected but no internet (exclamation mark)如何检测 WiFi 连接但没有互联网(感叹号)
【发布时间】:2018-10-01 22:49:15
【问题描述】:

我想在连接到 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 操作向我的接收者注册的特定操作?

【问题讨论】:

标签: android kotlin android-wifi


【解决方案1】:

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

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

【讨论】:

  • 这是一种可以调用一次的方法 - 我只想在连接到 WiFi 但没有互联网连接时才对更改做出反应
  • 你的意思是什么?您想对您连接的无法访问互联网的 Wifi 做出反应???您首先需要代码来检查您是否已连接?
  • 因为如果您连接到 wifi 或手机!那么您可以在您喜欢的时间进行检查!如果您可以访问互联网,它就会返回!如果我遗漏了什么,请解释一下!。
  • 关键是我不想检查接入点是否有互联网连接,所以你句子的第二部分不是我要找的。我希望能够在我连接到 wifi 时接收状态,但 AP 刚刚失去互联网连接并对其做出反应(例如,在 Android 状态栏上显示感叹号)
  • 我想相信有一个 api 可以做到这一点!
【解决方案2】:

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

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

}

那么你必须在 Manifest 中注册:

<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() 你会知道你是否连接到互联网。

不要忘记权限:

<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" />

【讨论】:

  • 你没有理解我的问题
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多