import network, { NetworkResponse } from '@system.network'; import { connection } from '@kit.NetworkKit'; import { xNetworkType } from "../interface" import radio from '@ohos.telephony.radio' import { Emitter, onNativePageReady } from '@dcloudio/uni-runtime'; import { BusinessError } from "@kit.BasicServicesKit"; export type OnNetworkStatusChangeCallbackResult = { /** * 当前是否有网络连接 * @type boolean */ isConnected : boolean, /** * 网络类型 */ networkType : string }; export type OnNetworkStatusChangeCallback = (result : OnNetworkStatusChangeCallbackResult) => void; export type OnNetworkStatusChange = (callback : OnNetworkStatusChangeCallback) => void; export type OffNetworkStatusChange = (callback : (result : any) => void) => void; interface IUniGetNetworkTypeEventEmitter { on : (eventName : string, callback : Function) => void once : (eventName : string, callback : Function) => void off : (eventName : string, callback ?: Function) => void emit : (eventName : string, ...args : (Object | undefined | null)[]) => void } const UniGetNetworkTypeEventEmitter = new Emitter() as IUniGetNetworkTypeEventEmitter function networkGetType() { return new Promise((resolve, reject) => { try { radio.getPrimarySlotId() .then((slotId : number) => radio.getSignalInformationSync(slotId)) .then((signalInformation : Array) => { const data = signalInformation[0] if (data && data.signalType) { resolve(signalType(data.signalType)) } else { resolve(NetworkinfoType.NONE) } }) } catch (error) { reject(error as BusinessError) } }) } enum NetworkinfoType { // 网络连接状态未知 UNKNOW = 0, // 未连接网络 NONE = 1, // 有线网络 ETHERNET = 2, // 无线WIFI网络 WIFI = 3, "2G" = 4, "3G" = 5, "4G" = 6, "5G" = 7, } function signalType(resultObj : radio.NetworkType) : number { switch (resultObj) { case radio.NetworkType.NETWORK_TYPE_GSM: case radio.NetworkType.NETWORK_TYPE_CDMA: return NetworkinfoType['2G'] case radio.NetworkType.NETWORK_TYPE_WCDMA: case radio.NetworkType.NETWORK_TYPE_TDSCDMA: return NetworkinfoType['3G'] case radio.NetworkType.NETWORK_TYPE_LTE: return NetworkinfoType['4G'] case radio.NetworkType.NETWORK_TYPE_NR: return NetworkinfoType['5G'] case radio.NetworkType.NETWORK_TYPE_UNKNOWN: return NetworkinfoType.UNKNOW default: return NetworkinfoType.NONE } } // 构造单例对象 class GlobalContext { public netList : connection.NetHandle[] = []; public netHandle : connection.NetHandle | null = null; private constructor() { } private static instance : GlobalContext; public static getContext() : GlobalContext { if (!GlobalContext.instance) { GlobalContext.instance = new GlobalContext(); } return GlobalContext.instance; } } //当前是否有网络。 export function isNetworkAvailable() : Promise { return new Promise((resolve) => { try { radio.getPrimarySlotId() .then((slotId : number) => radio.getSignalInformationSync(slotId)) .then((signalInformation : Array) => { const data = signalInformation[0] if (data && data.signalType) { resolve(signalType(data.signalType) != NetworkinfoType.NONE) } else { resolve(false) } }) } catch (error) { resolve(false) } }) } export function getNetworkType() : Promise { return new Promise((resolve, reject) => { try { // 调用getDefaultNet方法,获取默认的数据网络(NetHandle) connection.getDefaultNet().then((data : connection.NetHandle) => { if (data) { GlobalContext.getContext().netHandle = data; // 获取netHandle对应网络的能力信息。能力信息包含了网络类型、网络具体能力等网络信息 connection.getNetCapabilities(GlobalContext.getContext().netHandle!).then((data : connection.NetCapabilities) => { // 获取网络类型(bearerTypes) const bearerTypes : Set = new Set(data.bearerTypes); const bearerTypesNum = Array.from(bearerTypes.values()); for (const item of bearerTypesNum) { if (item == connection.NetBearType.BEARER_CELLULAR) { // 蜂窝网 networkGetType().then(() => { resolve('Mobile') }).catch(reject) } else if (item == connection.NetBearType.BEARER_WIFI) { // Wi-Fi网络 resolve('WiFi') } else if (item == connection.NetBearType.BEARER_ETHERNET) { // 以太网网络 resolve('WiredNetwork') } else { resolve('Other') } } }).catch((err : BusinessError) => { reject(err) }) } }) } catch (error) { reject(null) } }) } function invokeOnNetworkStatusChange(networkType : string) { // UniGetNetworkTypeEventEmitter.emit( // 'networkStatusChange', // { // isConnected: networkType !== NetworkinfoType[1], // networkType: networkType.toLocaleLowerCase(), // } as OnNetworkStatusChangeCallbackResult // ) UniGetNetworkTypeEventEmitter.emit('networkStatusChange',networkType !== NetworkinfoType[1]) } function getCurrentType() { return new Promise((resolve, reject) => { // 调用getDefaultNet方法,获取默认的数据网络(NetHandle) connection.getDefaultNet().then((data : connection.NetHandle) => { if (data) { GlobalContext.getContext().netHandle = data; // 获取netHandle对应网络的能力信息。能力信息包含了网络类型、网络具体能力等网络信息 connection.getNetCapabilities(GlobalContext.getContext().netHandle!).then((data : connection.NetCapabilities) => { // 获取网络类型(bearerTypes) const bearerTypes : Set = new Set(data.bearerTypes); const bearerTypesNum = Array.from(bearerTypes.values()); for (const item of bearerTypesNum) { if (item == connection.NetBearType.BEARER_CELLULAR) { // 蜂窝网 networkGetType().then(resolve).catch(reject) } else if (item == connection.NetBearType.BEARER_WIFI) { // Wi-Fi网络 resolve(NetworkinfoType.WIFI) } else if (item == connection.NetBearType.BEARER_ETHERNET) { // 以太网网络 resolve(NetworkinfoType.ETHERNET) } else { resolve(NetworkinfoType.UNKNOW) } } }).catch((err : BusinessError) => { reject(err) }) } }) }) } class Network { static netConnection : connection.NetConnection | null = null constructor() { Network.netConnection = connection.createNetConnection() } static ohoSubscribe() { if (!Network.netConnection) { Network.netConnection = connection.createNetConnection() } if (Network.netConnection) { Network.netConnection.register((err : BusinessError) => { }) Network.netConnection.on('netCapabilitiesChange', (capability : connection.NetCapabilityInfo) => { const NetBearType = capability?.netCap?.bearerTypes[0] let networkType = '' switch (NetBearType) { case connection.NetBearType.BEARER_CELLULAR: getCurrentType().then((type : number) => { invokeOnNetworkStatusChange(NetworkinfoType[type]) }).catch(() => { invokeOnNetworkStatusChange(NetworkinfoType[1]) }) return case connection.NetBearType.BEARER_WIFI: networkType = NetworkinfoType[3] break case connection.NetBearType.BEARER_ETHERNET: networkType = NetworkinfoType[2] break /* case connection.NetBearType.BEARER_VPN: networkType = 'vpn' break */ default: networkType = NetworkinfoType[1] } invokeOnNetworkStatusChange(networkType) }) Network.netConnection.on('netLost', (netLost : connection.NetHandle) => { invokeOnNetworkStatusChange(NetworkinfoType[1]) }) } } } new Network() type CallType = (conecting : boolean) => void; let call : CallType = (conecting : boolean) => { } export const xNetChange = (callback : CallType) => { call = callback; UniGetNetworkTypeEventEmitter.on('networkStatusChange', call) } //取消监听 export function xUnNetChange() { UniGetNetworkTypeEventEmitter.off('networkStatusChange', call) } onNativePageReady().then(() => { Network.ohoSubscribe() })