![](/img/trans.png)
[英]Hi My App Is Crashing On Android Devices on Api Level 21 and Below
[英]how to check for NO INTERNET in devices below API level 21
這是我的 MainActivity,我已經在 onstart 中注冊了我的網絡調用。 在此代碼中,無論設備是否打開互聯網 wifi,都不會調用onUnavailable() 。 我想在單擊按鈕后檢查互聯網,如果連接了互聯網,它將繼續進行下一個活動,否則沒有
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 秒。
為了輕松檢查互聯網,請使用此 function,它在 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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.