как проверить НЕТ ИНТЕРНЕТА на устройствах ниже уровня API 21
Это моя MainActivity, я зарегистрировал свой сетевой вызов обратно в onstart. В этом коде onUnavailable() никогда не вызывается, независимо от того, подключено устройство к Wi-Fi или нет. Я хочу проверить наличие Интернета после нажатия кнопки, он перейдет к следующему действию, если Интернет подключен, а в противном случае нет
public class MainActivity extends AppCompatActivity {
private TextView textView;
ConnectivityManager.NetworkCallback networkCallback;
ConnectivityManager manager;
public static final String TAG = "bantai";
private NetworkRequest networkRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.internetTextview);
networkRequest = new NetworkRequest.Builder().build();
manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("onAvailable");
}
});
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Log.d(TAG, "onLosing: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("loosing");
}
});
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.d(TAG, "onLost: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("lost");
}
}); }
@Override
public void onUnavailable() {
super.onUnavailable();
Log.d(TAG, "onUnavailable: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("unavailable");
}
}); }
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
Log.d(TAG, "onCapabilitiesChanged: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("capability");
}
}); }
@Override
public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Log.d(TAG, "onLinkPropertiesChanged: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("link");
}
}); }
@Override
public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
super.onBlockedStatusChanged(network, blocked);
Log.d(TAG, "onBlockedStatusChanged: ");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "onAvailable: "+ Thread.currentThread().getName());
textView.setText("blocked");
}
}); }
};
}
@Override
protected void onStart() {
super.onStart();
manager.requestNetwork(networkRequest,networkCallback);
}
@Override
protected void onStop() {
super.onStop();
manager.unregisterNetworkCallback(networkCallback);
}
Также ConnectivityManager.requestNetwork(networkRequest, networkCallback, 3000)
для этой команды требуется уровень Api 21 + с таймаутом 3 секунды.
1 ответ
Для проверки Интернета легко используйте эту функцию, она реагирует на api 16 и выше:
в AndroidManifest.xml добавьте:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
теперь для проверки статуса сети:
getActiveNetworkInfo устарела в API 29.
getAllNetworkInfo устарела в API 23.
fun isConnected(): Boolean { val hasInternet: Boolean val connectivityManager = ctx.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val networkCapabilities = connectivityManager.activeNetwork ?: return false val actNw = connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false hasInternet = when { actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true else -> false } } else { hasInternet = try { if (connectivityManager.activeNetworkInfo == null) { false } else { connectivityManager.activeNetworkInfo?.isConnected!! } } catch (e: Exception) { false } } return hasInternet}