ConnectivityManager Networkcallback не перехватывает соединение с сетью Wi-Fi без подключения к интернету
У меня есть устройство, к которому мое приложение может подключиться через WIFI, но на устройстве нет Интернета. Я реализовал NetworkCallback для отслеживания изменений в подключении как таковых:
public class ConnectivityNetworkCallback extends ConnectivityManager.NetworkCallback{
@Override
public void onAvailable(android.net.Network network) {
super.onAvailable(network);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
mConnectivityManager.bindProcessToNetwork(network);
else
ConnectivityManager.setProcessDefaultNetwork(network);
NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
int connectionType = networkInfo.getType();
Log.e("networkCallback", "connectionType: " + networkInfo.getTypeName());
switch(connectionType){
case ConnectivityManager.TYPE_WIFI:
String networkName = networkInfo.getExtraInfo().substring(1,networkInfo.getExtraInfo().length()-1);
Log.e("networkCallback","network type wifi, extra: " + networkName);
break;
case ConnectivityManager.TYPE_MOBILE:
Log.e("networkCallback","network type mobile, extra: " + networkInfo.getExtraInfo());
break;
}
}
@Override
public void onLost(android.net.Network network) {
super.onLost(network);
Log.e("networkCallback", "losing active connection");
}
}
Когда мои Wi-Fi и мобильные данные включены, и я переключаюсь между различными сетями Wi-Fi с доступом к Интернету, "onAvailable()" запускает и печатает, чтобы регистрировать, что я подключен через Wi-Fi. Как только я пытаюсь подключиться к сети Wi-Fi без интернета, метод onAvailable () запускает и печатает, что я подключен через мобильное устройство, а также устройство показывает восклицательный знак рядом со значком Wi-Fi.
Есть ли способ, которым я все еще могу поймать случай, когда я подключен к сети Wi-Fi без интернета?
3 ответа
Я боролся с той же проблемой. Что, кажется, работает для меня сейчас, так это сначала получить сетевые возможности:
connectivityManager.getNetworkCapabilities(network)
А затем проверьте, есть ли у соединения интернет и проверено ли:
private val NetworkCapabilities.hasInternet
get() = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
else -> true
}
К сожалению,
NetworkCapabilities.NET_CAPABILITY_VALIDATED
флаг был введен только в API 23, поэтому в этом случае я его игнорирую.
Вы должны зарегистрироваться для обратного вызова по сети с помощью Connectivity Manager.
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequestBuilder.Builder builder = new NetworkRequest.Builder()
//Use builder to set custom network parameter
connMgr.requestNetwork(builder.build(),new ConnectivityNetworkCallback())
Создать утилиты
public class CheckInternet extends AsyncTask<Void,Void,Boolean> {
private Consumer mConsumer;
public interface Consumer { void accept(Boolean internet); }
public CheckInternet(Consumer consumer) { mConsumer = consumer; execute(); }
@Override protected Boolean doInBackground(Void... voids) { try {
Socket sock = new Socket();
sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
sock.close();
return true;
} catch (IOException e) { return false; } }
@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
Используйте этот метод для проверки интернет-соединения
new InternetCheck(internet -> {
if (internet){
check your condition
}else {
//error message
}