鴻蒙系統(tǒng)獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài)以及監(jiān)聽網(wǎng)絡(luò)狀態(tài)
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
一、前言
在應(yīng)用開發(fā)過程中,總是需要獲取網(wǎng)絡(luò)狀態(tài),當(dāng)前是否有網(wǎng)絡(luò),當(dāng)前是使用數(shù)據(jù)網(wǎng)絡(luò)還是使用無線網(wǎng)絡(luò)。鴻蒙提供了一系列方法來獲取網(wǎng)絡(luò)狀態(tài)。
二、添加權(quán)限
ohos.permission.GET_NETWORK_INFO 這個(gè)權(quán)限用于獲取網(wǎng)絡(luò)信息。
ohos.permission.INTERNET 這個(gè)權(quán)限用于訪問網(wǎng)絡(luò)1.2。
這兩個(gè)權(quán)限不需要?jiǎng)討B(tài)申請(qǐng),只需要在配置文件中聲明即可。
添加權(quán)限的方式查看下圖,如果你沒辦法像下圖一樣的操作,請(qǐng)把編譯器升級(jí)到最新版。
三、獲取網(wǎng)絡(luò)狀態(tài)
3、1 獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài)
下面的類可以獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài),并且可以判斷能否上網(wǎng)。有時(shí)我們連接了一個(gè)網(wǎng)絡(luò),但由于網(wǎng)絡(luò)已經(jīng)到期(該交錢了)或者代理不可用,設(shè)備雖然連接了網(wǎng)絡(luò),但是不能上網(wǎng)。
- public class NetworkUtil {
- /**
- * 網(wǎng)絡(luò)是否連接
- *
- * @param context 上下文
- * @return true表示網(wǎng)絡(luò)已經(jīng)連接,并且可以上網(wǎng)。false表示網(wǎng)絡(luò)沒連接,或者網(wǎng)絡(luò)連接了,但是不能上網(wǎng)
- */
- public static boolean isNetworkConnectedInternet(Context context) {
- NetManager netManager = NetManager.getInstance(context);
- NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
- // NetCapabilities.NET_CAPABILITY_VALIDATED表示連接了網(wǎng)絡(luò),并且可以上網(wǎng)
- return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED);
- }
- /**
- * 是否是WiFi連接
- *
- * @param context 上下文
- * @return true表示W(wǎng)iFi連接,并且可以上網(wǎng)。false表示W(wǎng)iFi沒連接,或者WiFi連接了,但是不能上網(wǎng)
- */
- public static boolean isWifiConnectedInternet(Context context) {
- // 獲取網(wǎng)絡(luò)管理對(duì)象
- NetManager netManager = NetManager.getInstance(context);
- // 獲取NetCapabilities對(duì)象
- NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
- // NetCapabilities.NET_CAPABILITY_VALIDATED表示連接了網(wǎng)絡(luò),并且可以上網(wǎng)
- return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED) &&
- netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI) ||
- netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE);
- }
- /**
- * 是否是數(shù)據(jù)網(wǎng)絡(luò)連接
- *
- * @param context 上下文
- * @return true表示數(shù)據(jù)網(wǎng)絡(luò)連接,并且可以上網(wǎng)。false表示數(shù)據(jù)網(wǎng)絡(luò)沒連接,或者數(shù)據(jù)網(wǎng)絡(luò)連接了,但是不能上網(wǎng)
- */
- public static boolean isMobileConnectedInternet(Context context) {
- NetManager netManager = NetManager.getInstance(context);
- NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
- // NetCapabilities.NET_CAPABILITY_VALIDATED表示連接了網(wǎng)絡(luò),并且可以上網(wǎng)
- return netCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED) &&
- netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);
- }
- /**
- * 這種方式也可以判斷網(wǎng)絡(luò)是否連接
- *
- * @param context 上下文
- * @return 只要網(wǎng)絡(luò)已經(jīng)連接,就返回true,不管能不能上網(wǎng)。有時(shí)我們連接了一個(gè)網(wǎng)絡(luò),但由于網(wǎng)絡(luò)已經(jīng)到期(該交錢了)或者使用的代理不可用,設(shè)備雖然連接了網(wǎng)絡(luò),但是不能上網(wǎng)
- */
- public static boolean isNetworkConnected(Context context) {
- NetManager netManager = NetManager.getInstance(context);
- NetHandle[] allNets = netManager.getAllNets();
- return allNets != null && allNets.length > 0;
- }
- /**
- * 是否是WiFi連接
- *
- * @param context 上下文
- * @return 只要是WiFi連接,就返回true,不管能不能上網(wǎng)。有時(shí)我們連接了一個(gè)網(wǎng)絡(luò),但由于網(wǎng)絡(luò)已經(jīng)到期(該交錢了)或者使用的代理不可用,設(shè)備雖然連接了網(wǎng)絡(luò),但是不能上網(wǎng)
- */
- public static boolean isWifiConnected(Context context) {
- // 獲取網(wǎng)絡(luò)管理對(duì)象
- NetManager netManager = NetManager.getInstance(context);
- // 獲取NetCapabilities對(duì)象
- NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
- return netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI) ||
- netCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE);
- }
- /**
- * 是否是數(shù)據(jù)網(wǎng)絡(luò)連接
- *
- * @param context 上下文
- * @return 只要是數(shù)據(jù)網(wǎng)絡(luò)連接,就返回true,不管能不能上網(wǎng)。有時(shí)我們連接了一個(gè)網(wǎng)絡(luò),但由于網(wǎng)絡(luò)已經(jīng)到期(該交錢了),設(shè)備雖然連接了網(wǎng)絡(luò),但是不能上網(wǎng)
- */
- public static boolean isMobileConnected(Context context) {
- NetManager netManager = NetManager.getInstance(context);
- NetCapabilities netCapabilities = netManager.getNetCapabilities(netManager.getDefaultNet());
- return netCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR);
- }
- }
3、2 獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài),監(jiān)聽網(wǎng)絡(luò)狀態(tài)
上面的方式只能獲取到當(dāng)前的網(wǎng)絡(luò)狀態(tài),并不能獲取到實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)。用戶可以隨時(shí)打開或者關(guān)閉網(wǎng)絡(luò),當(dāng)用戶打開或者關(guān)閉網(wǎng)絡(luò)的時(shí)候,我們希望可以實(shí)時(shí)的獲取到網(wǎng)絡(luò)狀態(tài)。要想獲取到實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài),就需要對(duì)網(wǎng)絡(luò)進(jìn)行監(jiān)聽。
NetStatusCallback用于監(jiān)聽網(wǎng)絡(luò)的狀態(tài),可以繼承該類來監(jiān)聽網(wǎng)絡(luò)的狀態(tài)。它有以下幾個(gè)方法:
其中最為常用的方法為onAvailable,onLost,onCapabilitiesChanged方法。
自定義一個(gè)類,繼承NetStatusCallback。
- /**
- * @author 裴云飛
- * @date 2021/4/11
- */
- public class DefaultNetStatusCallback extends NetStatusCallback {
- @Override
- public void onAvailable(NetHandle handle) {
- super.onAvailable(handle);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)連接成功");
- }
- @Override
- public void onBlockedStatusChanged(NetHandle handle, boolean blocked) {
- super.onBlockedStatusChanged(handle, blocked);
- LogUtils.d("yunfei", "訪問的網(wǎng)絡(luò)阻塞狀態(tài)發(fā)生變化");
- }
- @Override
- public void onLosing(NetHandle handle, long maxMsToLive) {
- super.onLosing(handle, maxMsToLive);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)正在丟失連接");
- }
- @Override
- public void onLost(NetHandle handle) {
- super.onLost(handle);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)已斷開連接");
- }
- @Override
- public void onUnavailable() {
- super.onUnavailable();
- LogUtils.d("yunfei", "網(wǎng)絡(luò)連接超時(shí)或網(wǎng)絡(luò)不可達(dá)");
- }
- @Override
- public void onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities) {
- super.onCapabilitiesChanged(handle, networkCapabilities);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)狀態(tài)變化但仍舊是可用狀態(tài)");
- }
- @Override
- public void onConnectionPropertiesChanged(NetHandle handle, ConnectionProperties connectionProperties) {
- super.onConnectionPropertiesChanged(handle, connectionProperties);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)連接的屬性被修改");
- }
- }
onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities)是較為常用的網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)的監(jiān)聽,其中的參數(shù)networkCapabilities有兩個(gè)常用的方法。
hasCap判斷網(wǎng)絡(luò)是否連接,有多個(gè)參數(shù)(具體的參數(shù)可查看NetCapabilities),其中常用參數(shù)如下:
hasBearer可以判斷網(wǎng)絡(luò)的類型,同樣有多個(gè)參數(shù)(具體的參數(shù)可查看NetCapabilities),其中常用參數(shù)如下:
onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities)的具體使用如下:
- @Override
- public void onCapabilitiesChanged(NetHandle handle, NetCapabilities networkCapabilities) {
- super.onCapabilitiesChanged(handle, networkCapabilities);
- LogUtils.d("yunfei", "網(wǎng)絡(luò)狀態(tài)變化但仍舊是可用狀態(tài)");
- if (networkCapabilities.hasCap(NetCapabilities.NET_CAPABILITY_VALIDATED)) {
- // 網(wǎng)絡(luò)連接成功,并且可以上網(wǎng)
- if (networkCapabilities.hasBearer(NetCapabilities.BEARER_WIFI)||
- networkCapabilities.hasBearer(NetCapabilities.BEARER_WIFI_AWARE)) {
- LogUtils.d("yunfei", "使用WiFi");
- } else if (networkCapabilities.hasBearer(NetCapabilities.BEARER_CELLULAR) ||
- networkCapabilities.hasBearer(NetCapabilities.BEARER_ETHERNET)) {
- LogUtils.d("yunfei", "使用數(shù)據(jù)網(wǎng)絡(luò)");
- } else {
- // 其它網(wǎng)絡(luò),包括藍(lán)牙、VPN、LoWPAN等
- LogUtils.d("yunfei", "其它網(wǎng)絡(luò)");
- }
- }
- }
定義好監(jiān)聽網(wǎng)絡(luò)的類后,就可以使用了。要想獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài),直接調(diào)用NetworkUtil類中的方法即可。要想獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài),就需要添加監(jiān)聽,首先獲取網(wǎng)絡(luò)管理對(duì)象,然后添加監(jiān)聽,這樣就能實(shí)時(shí)的監(jiān)聽到網(wǎng)絡(luò)的狀態(tài)了。最后別忘了在onStop方法里面移除監(jiān)聽。
- public class MainAbilitySlice extends AbilitySlice {
- private NetManager netManager;
- private DefaultNetStatusCallback mDefaultNetStatusCallback = new DefaultNetStatusCallback();
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_main);
- /*
- * 網(wǎng)絡(luò)是否連接,true表示網(wǎng)絡(luò)已經(jīng)連接,但未必可以上網(wǎng),
- * 有時(shí)我們連接了一個(gè)網(wǎng)絡(luò),但由于網(wǎng)絡(luò)已經(jīng)到期(該交錢了)或者使用的代理不可用,
- * 設(shè)備雖然連接了網(wǎng)絡(luò),但是不能上網(wǎng)
- */
- boolean networkConnect = NetworkUtil.isNetworkConnected(this);
- // 是否是WiFi連接,只要是WiFi連接,就返回true,不管能不能上網(wǎng)。
- boolean wifiConnected = NetworkUtil.isWifiConnected(this);
- // 否是數(shù)據(jù)網(wǎng)絡(luò)連接,只要是數(shù)據(jù)網(wǎng)絡(luò)連接,就返回true,不管能不能上網(wǎng)
- boolean mobileConnected = NetworkUtil.isMobileConnected(this);
- // 網(wǎng)絡(luò)是否連接,true表示網(wǎng)絡(luò)已經(jīng)連接,并且可以上網(wǎng)
- boolean networkConnectedInternet = NetworkUtil.isNetworkConnectedInternet(this);
- // 是否是WiFi連接,true表示W(wǎng)iFi連接,并且可以上網(wǎng)
- boolean wifiConnectedInternet = NetworkUtil.isWifiConnectedInternet(this);
- // 是否是數(shù)據(jù)網(wǎng)絡(luò)連接,true表示數(shù)據(jù)網(wǎng)絡(luò)連接,并且可以上網(wǎng)
- boolean mobileConnectedInternet = NetworkUtil.isMobileConnectedInternet(this);
- /*
- * 下面的代碼用于獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)。用戶可以隨時(shí)打開或者關(guān)閉網(wǎng)絡(luò),當(dāng)用戶打開或者關(guān)閉網(wǎng)絡(luò)時(shí),
- * 我們可以獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)
- */
- // 獲取網(wǎng)絡(luò)管理對(duì)象
- netManager = NetManager.getInstance(this);
- // 添加監(jiān)聽,監(jiān)聽實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)
- netManager.addDefaultNetStatusCallback(mDefaultNetStatusCallback);
- }
- @Override
- public void onActive() {
- super.onActive();
- }
- @Override
- public void onForeground(Intent intent) {
- super.onForeground(intent);
- }
- @Override
- protected void onStop() {
- super.onStop();
- if (netManager != null) {
- // 移除監(jiān)聽
- netManager.removeNetStatusCallback(mDefaultNetStatusCallback);
- }
- }
- }
四、總結(jié)
本文主要是對(duì)獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)以及監(jiān)聽網(wǎng)絡(luò)狀態(tài)進(jìn)行講解,需要注意當(dāng)前的網(wǎng)絡(luò)狀態(tài)和實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)的區(qū)別。
最后奉上源碼,代碼運(yùn)行起來后,大家可以隨時(shí)打開或者關(guān)閉網(wǎng)絡(luò),以獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)