Как определить, что WiFi подключен, но нет интернета (восклицательный знак) - PullRequest
0 голосов
/ 02 октября 2018

Я хочу реплицировать поведение строки состояния самостоятельно при подключении к WiFi.

Я зарегистрировал получателя, но я не знаю, какое именно действие я должен слушать, чтобы его можно было обнаружитьесли я подключен к точке доступа WiFi, но на ней нет подключения к Интернету (точка доступа отключена).

Я пытался:

 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, но без подключения к Интернету.

Есть ли какое-то конкретное действие, для которого я должен зарегистрироваться в моем приемнике, используя WiFiManager действие?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Сначала вы должны создать BroadcastReceiver:

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 () вы узнаете, подключаетесь ли вы к Интернету или нет.

не забывайте разрешения:

<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" />
0 голосов
/ 02 октября 2018

Я, вероятно, пойду на этот метод прямо здесь!

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