После того, как connectivityManager.getActiveNetworkInfo () устарел в API 29, было довольно сложно собрать функцию мониторинга сети, которая также отличала бы guish измеренный (ячейка) от WiFi-соединения.
Проблемы, с которыми я столкнулся, были 2:
connectivityManager.isActiveNetworkMetered () - когда были включены и данные Wi-Fi, и мобильные данные, они возвращали значение true (по крайней мере, на моем эмуляторе, и я не мог проверить устройство). Когда был включен только WiFi, он возвращал false, как и ожидалось.
connectivityManager.isDefaultNetworkActive () - он всегда будет активен, даже если WiFi и Mobile были отключены.
Единственный способ обойти это - через (1) onCapabilitiesChanged () и (2) getActiveNetwork () == null. Код вставлен ниже.
Знаете ли вы, есть ли другие способы сделать это? Вся реализация кажется громоздкой, а inte rnet полон устаревших примеров.
Спасибо
private static void monitorNetworks(){
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(
builder.build(),
ncb = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
scanAndSend();
}
@Override
public void onLost(Network network) {
scanAndSend();
}
@Override
public void onUnavailable(){
scanAndSend();
}
@Override
public void onCapabilitiesChanged (Network network,
NetworkCapabilities networkCapabilities){
boolean metered = !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
Log.d(TAG, "NET_CAPABILITY_NOT_METERED: " +
String.valueOf(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)));
sendMetered(metered);
}
}
);
}
private static void scanAndSend(){
boolean is_connected = false;
if(connectivityManager.getActiveNetwork()==null) is_connected = false;
else is_connected = true;
sendConnectivityIntent(IS_NETWORK_AVAILABLE, is_connected);
}
private static void sendMetered(boolean metered) {
sendIntent(IS_NETWORK_METERED, metered);
}
private static void sendIntent(String val_name, boolean val) {
Intent intent = new Intent();
intent.setAction(CONNECTIVITY_ACTION);
intent.putExtra(val_name, val);
context.sendBroadcast(intent);
}