Я знаю, что вы можете написать код, с помощью которого вы можете определить, подключено ли устройство к сети.
Но в моем приложении я хочу получать уведомление, если устройство меняет свое состояние с «сеть» на «нет сети». Это может произойти, например, когда пользователь заходит в туннель и теряет сигнал и т. Д. Или при подключении к 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>
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);
Принятый ответ не сработал (мой планшет был подключен к 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>
Не уверен, поможет ли это, но это выглядит аналогично ...
Я реализовал эту функцию путем опроса 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);
Если вы пытаетесь сделать это в Котлине. Используйте это
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
}
Сделайте это в потоке.