权限
在module.json5
中添加必要权限:
// 声明应用需要请求的权限列表
"requestPermissions": [
{
"name": "ohos.permission.GET_NETWORK_INFO", // 网络信息权限
"reason": "$string:network_info_reason",
"usedScene": {
"abilities": ['MFVoiceManager'],
"when": "always"
}
},
{
"name": "ohos.permission.INTERNET", // 网络权限
"reason": "$string:internet_reason",
"usedScene": {
"abilities": [],
"when": "always"
}
}
],
{
"name": "network_info_reason",
"value": "需要网络信息权限用于监听网络的变化"
},
{
"name": "internet_reason",
"value": "需要网络权限用来网络请求"
},
监听工具
/**
* 网络状态监听工具类
* 功能:实时监测网络连接状态及类型变化
*/
import { connection } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import ConsoleLog from '../extension/ConsoleLog';
// 网络类型定义
type NetworkType = 'NONE' | 'CELLULAR' | 'WIFI' | 'ETHERNET';
class NetworkMonitor {
private static instance: NetworkMonitor;
private netConnection?: connection.NetConnection;
private listeners: Array<(status: NetworkType) => void> = [];
// 单例获取
static getInstance(): NetworkMonitor {
if (!NetworkMonitor.instance) {
NetworkMonitor.instance = new NetworkMonitor();
}
return NetworkMonitor.instance;
}
/**
* 启动网络监听
*/
startMonitoring(): void {
try {
this.netConnection = connection.createNetConnection();
// 注册网络状态监听
this.netConnection.register((err: BusinessError) => {
if (err) {
ConsoleLog.error(`网络状态监听注册失败: ${err.code}-${err.message}`);
} else {
ConsoleLog.log('网络状态监听注册成功');
}
});
// 监听网络可用事件
this.netConnection.on('netAvailable', (data: connection.NetHandle) => {
ConsoleLog.log('网络已连接');
this.checkNetworkType(data);
});
// 监听网络断开事件
this.netConnection.on('netLost', () => {
ConsoleLog.log('网络已断开 - 无互联网连接');
});
// 监听网络不可用事件
this.netConnection.on('netUnavailable', () => {
ConsoleLog.log('网络不可用');
});
} catch (error) {
ConsoleLog.error(`NetworkMonitor Initialization error: ${error}`);
}
}
// 检查当前网络类型
checkNetworkType(netHandle: connection.NetHandle) {
connection.getNetCapabilities(netHandle, (error: BusinessError, data: connection.NetCapabilities) => {
if (error) {
ConsoleLog.error('获取网络能力失败:', JSON.stringify(error));
return;
}
if (data && data.bearerTypes) {
const networkType = this.parseBearerType(data.bearerTypes[0]);
ConsoleLog.log('当前网络类型:', networkType);
this.triggerListeners(true, networkType); // 触发回调
}
});
}
/**
* 解析网络承载类型
* @param type 网络类型编码
* @returns 标准化网络类型
*/
private parseBearerType(type?: number): NetworkType {
if (!type) return 'NONE';
switch(type) {
case connection.NetBearType.BEARER_CELLULAR: return 'CELLULAR'; // 蜂窝网络
case connection.NetBearType.BEARER_WIFI: return 'WIFI'; // Wi-Fi
case connection.NetBearType.BEARER_ETHERNET: return 'ETHERNET'; // 以太网
default: return 'NONE'; // 未知网络
}
}
/**
* 注册状态监听
* @param callback 状态变更回调函数
*/
addListener(callback: (status: NetworkType) => void): void {
this.listeners.push(callback);
}
/**
* 移除状态监听
* @param callback 要移除的回调函数
*/
removeListener(callback: Function): void {
this.listeners = this.listeners.filter(cb => cb !== callback);
}
// 在事件处理方法中触发回调(例如netAvailable事件)
private triggerListeners(isConnected: boolean, type: NetworkType) {
this.listeners.forEach(cb => cb(type));
}
}
export const networkMonitor = NetworkMonitor.getInstance();
示例
// 窗口舞台创建回调
onWindowStageCreate(windowStage: window.WindowStage): void {
...
networkMonitor.startMonitoring()
}