UniApp X 安卓App的Wi-Fi 状态监听器实战指南前言在移动应用开发中实时监听 Wi-Fi 连接状态变化是一个常见需求。本文将详细介绍如何使用 UniApp X (UTS) 开发一个健壮的 Wi-Fi 状态监听器帮助开发者快速实现网络状态检测功能。功能特性监听 Wi-Fi 开关状态变化开启/关闭监听网络连接状态变化连接/断开自动获取当前连接的 Wi-Fi 名称SSID单例模式设计避免重复注册监听器自动释放资源防止内存泄漏权限配置在使用 Wi-Fi 功能之前需要在AndroidManifest.xml中配置相应权限!-- Wi-Fi 权限 --uses-permissionandroid:nameandroid.permission.ACCESS_WIFI_STATE/uses-permissionandroid:nameandroid.permission.CHANGE_WIFI_STATE/!-- 获取 SSID 所需的位置权限 --uses-permissionandroid:nameandroid.permission.ACCESS_FINE_LOCATION/uses-permissionandroid:nameandroid.permission.ACCESS_COARSE_LOCATION/注意在 Android 8.0 及以上版本获取 Wi-Fi SSID 名称需要位置权限。即使应用本身不需要位置功能也必须申请此权限才能获取到真实的 SSID。核心代码实现必须先申请android.permission.ACCESS_FINE_LOCATION 权限 再进行下一步 这里就不写了// wifiListener.utsimportContextfromandroid.content.Context;importIntentfromandroid.content.Intent;importIntentFilterfromandroid.content.IntentFilter;importBroadcastReceiverfromandroid.content.BroadcastReceiver;importWifiManagerfromandroid.net.wifi.WifiManager;importWifiInfofromandroid.net.wifi.WifiInfo;importNetworkInfofromandroid.net.NetworkInfo;typeWifiStateData{isConnected:boolean;ssid?:string;}// 获取SSID 需要配置权限 android.permission.ACCESS_FINE_LOCATION 即app的位置权限开启 才能获取到 必须先申请权限classWifiBroadcastReceiverextendsBroadcastReceiver{privatecb:(data:WifiStateData)void;constructor(callback:(data:WifiStateData)void){super();this.cbcallback;}overrideonReceive(context:Context,intent:Intent){constactionintent.getAction();if(actionWifiManager.WIFI_STATE_CHANGED_ACTION){conststateintent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_UNKNOWN);if(stateWifiManager.WIFI_STATE_ENABLED){console.log([Wi-Fi] 已开启);constssidgetCurrentSSID();consthasSsidssid!null;if(hasSsid){this.cb({isConnected:true,ssid:ssid});}else{this.cb({isConnected:false});}}elseif(stateWifiManager.WIFI_STATE_DISABLED){console.log([Wi-Fi] 已关闭);this.cb({isConnected:false});}}elseif(actionWifiManager.NETWORK_STATE_CHANGED_ACTION){constnetworkInfointent.getParcelableExtraNetworkInfo(WifiManager.EXTRA_NETWORK_INFO);if(networkInfo!nullnetworkInfo.isConnected()){constwifiInfointent.getParcelableExtraWifiInfo(WifiManager.EXTRA_WIFI_INFO);letssid:string|nullnull;if(wifiInfo!null){constrawwifiInfo.getSSID();if(raw!nullraw!unknown ssid){ssidraw.replace(/^|$/g,);}}if(ssidnull){ssidgetCurrentSSID();}console.log([Wi-Fi] 已连接:,ssid!null?ssid:未知网络);if(ssid!null){this.cb({isConnected:true,ssid:ssid});}else{this.cb({isConnected:true});}}else{console.log([Wi-Fi] 已断开);this.cb({isConnected:false});}}}}/** * Wi-Fi 状态监听器 * 使用方法 * const listener WifiListener.getInstance(); * listener.startListening((state) { console.log(state); }); * // 页面销毁时listener.stopListening(); */classWifiListener{privatestaticinstance:WifiListener|nullnull;privatereceiver:BroadcastReceiver|nullnull;privatecontext:Context|nullnull;privateconstructor(){}publicstaticgetInstance():WifiListener{if(WifiListener.instancenull){WifiListener.instancenewWifiListener();}returnWifiListener.instance;}privategetContext():Context|null{if(this.contextnull){this.contextUTSAndroid.getAppContext();}returnthis.context;}/** * 开始监听 Wi-Fi 状态变化 * param callback 回调函数参数为 { isConnected: boolean, ssid?: string } */publicstartListening(callback:(data:WifiStateData)void):void{constcontextthis.getContext();if(contextnull){console.error(无法获取 Context);return;}this.stopListening();this.receivernewWifiBroadcastReceiver(callback);constfilternewIntentFilter();filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);try{context.registerReceiver(this.receiver,filter);console.log([Wi-Fi] 监听器已注册);}catch(e){console.error([Wi-Fi] 注册失败:,e);}}/** * 停止监听取消注册广播接收器 */publicstopListening():void{if(this.receiver!null){constcontextthis.getContext();if(context!null){try{context.unregisterReceiver(this.receiver);console.log([Wi-Fi] 监听器已取消注册);}catch(e){}}this.receivernull;}}}functiongetCurrentSSID():string|null{constcontextUTSAndroid.getAppContext();if(contextnull)returnnull;constwifiManagercontext.getSystemService(Context.WIFI_SERVICE)asWifiManager;if(wifiManagernull)returnnull;constwifiInfowifiManager.getConnectionInfo();if(wifiInfonull)returnnull;if(wifiInfo.getNetworkId()-1)returnnull;letssidwifiInfo.getSSID();if(ssid!nullssid!unknown ssid){ssidssid.replace(/^|$/g,);returnssid;}returnnull;}export{WifiListener,WifiStateData};使用示例在页面中使用template view viewWi-Fi 状态: {{ isConnected ? 已连接 : 未连接 }}/view view v-ifssid网络名称: {{ ssid }}/view /view /template script setup import { ref, onMounted, onUnmounted } from vue; import { WifiListener } from /utils/wifiHelper.uts; const isConnected ref(false); const ssid ref(); const wifiListener WifiListener.getInstance(); onMounted(() { wifiListener.startListening((state) { isConnected.value state.isConnected; ssid.value state.ssid || ; }); }); onUnmounted(() { wifiListener.stopListening(); }); /script技术要点解析1. 为什么需要继承 BroadcastReceiverAndroid 的 Wi-Fi 状态变化通过广播机制传递。BroadcastReceiver是 Android 四大组件之一用于接收系统广播。要监听 Wi-Fi 状态必须创建BroadcastReceiver的子类重写onReceive方法处理广播在AndroidManifest.xml或代码中注册接收器2. 为什么要使用单例模式privatestaticinstance:WifiListener|nullnull;publicstaticgetInstance():WifiListener{if(WifiListener.instancenull){WifiListener.instancenewWifiListener();}returnWifiListener.instance;}避免重复创建监听器实例确保全局只有一个广播接收器防止多次注册导致的资源浪费3. SSID 获取的注意事项functiongetCurrentSSID():string|null{constwifiInfowifiManager.getConnectionInfo();if(wifiInfo.getNetworkId()-1)returnnull;letssidwifiInfo.getSSID();if(ssid!nullssid!unknown ssid){ssidssid.replace(/^|$/g,);returnssid;}returnnull;}SSID 返回值可能包含引号需要去除unknown ssid表示无法获取真实的 SSIDgetNetworkId() -1表示未连接到任何网络常见问题Q: 为什么 SSID 返回 “”A: 这是 Android 的安全机制。在 Android 8.0 及以上版本第三方应用获取 SSID 需要满足以下条件位置权限已授予定位服务已开启应用具有ACCESS_FINE_LOCATION权限Q: 如何处理权限申请参考 https://blog.csdn.net/a3212768093/article/details/161656845?spm1001.2014.3001.5501总结本文详细介绍了使用 UniApp X 的 UTS 开发 Android 原生 Wi-Fi 监听器的方法。通过封装单例模式的WifiListener类开发者可以方便地在应用任何页面监听 Wi-Fi 状态变化无需关心广播接收器的注册和注销细节。关键技术点使用BroadcastReceiver接收系统广播单例模式确保全局唯一监听器正确处理权限和边界情况记得在页面销毁时停止监听