Как я могу получить уведомление, когда устройство теряет подключение к сети?

Я знаю, что вы можете написать код, с помощью которого вы можете определить, подключено ли устройство к сети.

Но в моем приложении я хочу получать уведомление, если устройство меняет свое состояние с «сеть» на «нет сети». Это может произойти, например, когда пользователь заходит в туннель и теряет сигнал и т. Д. Или при подключении к Wi-Fi пользователь выходит за пределы зоны действия точки доступа и больше не имеет доступа к Интернету.

Есть ли в Android API предоставляет кое-что, где вы можете зарегистрировать слушателя, чтобы получать уведомления каждый раз, когда происходит изменение состояния сети?

Я нашел этот код и попытался использовать его, но он ничего не делает. Я не получаю никаких уведомлений при изменении состояния сети.

public class ConnectivityManager extends PhoneStateListener{

Activity activity;
public ConnectivityManager(Activity a){
    TelephonyManager telephonyManager = (TelephonyManager)a.getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.listen(this, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
    activity = a;
}

@Override
public void onDataConnectionStateChanged(int state) {
    super.onDataConnectionStateChanged(state);
    switch (state) {
    case TelephonyManager.DATA_DISCONNECTED:
        new AlertDialog.Builder(activity).
        setCancelable(false).
        setTitle("Connection Manager").
        setMessage("There is no network connection. Please connect to internet and start again.").
        setNeutralButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                System.exit(0);
            }
        }).create();
        break;

    case TelephonyManager.DATA_CONNECTED:
        break;
    }
}
}

Кроме того, я добавил соответствующие разрешения в AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
29
задан Jason Plank 15 August 2011 в 16:23
поделиться

5 ответов

myTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

callStateListener = new PhoneStateListener(){
    public void onDataConnectionStateChanged(int state){
        switch(state){
        case TelephonyManager.DATA_DISCONNECTED:
            Log.i("State: ", "Offline");
            // String stateString = "Offline";
            // Toast.makeText(getApplicationContext(),
            // stateString, Toast.LENGTH_LONG).show();
            break;
        case TelephonyManager.DATA_SUSPENDED:
            Log.i("State: ", "IDLE");
            // stateString = "Idle";
            // Toast.makeText(getApplicationContext(),
            // stateString, Toast.LENGTH_LONG).show();
            break;
        }
    }       
};                      
myTelephonyManager.listen(callStateListener,
            PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); 
15
ответ дан 28 November 2019 в 01:36
поделиться

Принятый ответ не сработал (мой планшет был подключен к Wi-Fi - нет 3G). Следующий код работал для меня:

public class ConnectivityChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("*** Action: " + intent.getAction());
        if(intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) {
            Toast.makeText(context, "Connection changed", Toast.LENGTH_SHORT).show();
        }
    }
}

и переход на AndroidManifest.xml

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

<receiver android:name=".custom.ConnectivityChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
</receiver>
9
ответ дан 28 November 2019 в 01:36
поделиться

Не уверен, поможет ли это, но это выглядит аналогично ...

1
ответ дан 28 November 2019 в 01:36
поделиться

Я реализовал эту функцию путем опроса ConnectivityManager.

_connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);

Как только у нас есть менеджер по связям, просто время от времени опрашивайте его, чтобы узнать, все ли еще вы подключены

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final Runnable networkStatusChecker = new Runnable() {
    public void run() {
        NetworkInfo activeNetwork = _connectivityManager.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        if(!isConnected) {
            System.out.println("disconnected from network");
            networkCheckerHandle.cancel(true);
        }
    }
};
final ScheduledFuture networkCheckerHandle = scheduler.scheduleAtFixedRate(networkStatusChecker, 10, 10, SECONDS);
1
ответ дан 28 November 2019 в 01:36
поделиться

Если вы пытаетесь сделать это в Котлине. Используйте это

   val isInternetWorking: Boolean by lazy {
        var success = false
        try {
            val url = URL("https://google.com")
            val connection = url.openConnection() as HttpURLConnection
            connection.connectTimeout = 10000
            connection.connect()
            success = connection.responseCode === 200
        } catch (e: IOException) {
            e.printStackTrace()
        }

        return@lazy success
    }

Сделайте это в потоке.

0
ответ дан 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: