
Network Info Plus 是一个流行的 Flutter 插件,用于获取设备的网络信息,包括 Wi-Fi 名称、BSSID、IP 地址等。本文将详细介绍该插件在鸿蒙(HarmonyOS)平台的适配实现,包括功能介绍、技术实现和注意事项。
创建 ohos 模块
flutter create . --org dev.fluttercommunity.plus --template=plugin --platforms=ohosclass NetworkInfo {
Future<String?> getWifiName(); // 获取 Wi-Fi 名称
Future<String?> getWifiBSSID(); // 获取 Wi-Fi BSSID
Future<String?> getWifiIP(); // 获取 IPv4 地址
Future<String?> getWifiIPv6(); // 获取 IPv6 地址
Future<String?> getWifiSubmask(); // 获取子网掩码
Future<String?> getWifiGatewayIP(); // 获取网关 IP
Future<String?> getWifiBroadcast(); // 获取广播 IP
}鸿蒙端实现采用标准的 Flutter 插件架构:
export default class NetworkInfoPlusOhosPlugin implements FlutterPlugin, MethodCallHandler {
private channel: MethodChannel | null = null;
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(),
"dev.fluttercommunity.plus/network_info");
this.channel.setMethodCallHandler(this);
}
}
使用鸿蒙的 @kit.ConnectivityKit 中的 wifiManager:
import { wifiManager } from'@kit.ConnectivityKit';
// 获取 Wi-Fi 名称
async getWifiName() {
let wifiMessage = await wifiManager.getLinkedInfo().then(data => {
return data.ssid;
}).catch((error: number) => {
console.info("get linked info error");
});
return wifiMessage;
}
// 获取 BSSID
async getWifiBSSID() {
let wifiMessage = await wifiManager.getLinkedInfo().then(data => {
if (data && data.bssid !== undefined && data.bssid !== null) {
return data.bssid;
}
returnnull;
});
return wifiMessage;
}
// 获取 IPv4 地址
getWifiIPAddress() {
const bytes = [
wifiManager.getIpInfo().ipAddress >>> 24,
(wifiManager.getIpInfo().ipAddress >>> 16) & 0xFF,
(wifiManager.getIpInfo().ipAddress >>> 8) & 0xFF,
wifiManager.getIpInfo().ipAddress & 0xFF
];
return bytes.map(byte => byte.toString()).join('.');
}
// 获取 IPv6 地址
getIpV6() {
let info = wifiManager.getIpv6Info().linkIpv6Address;
return info === '' ? null : info;
}
// IP 地址与整数转换
ipToInt(ip: string): number {
let parts = ip.split('.');
let num = 0;
for (let i = 0; i < parts.length; i++) {
num |= parseInt(parts[i], 10) << (24 - 8 * i);
}
return num;
}
// 计算广播地址
getBroadcastIP() {
const ipInt = this.ipToInt(this.getWifiIPAddress() asstring);
const subnetMaskInt = this.ipToInt(this.getWifiSubnetMask() asstring);
const broadcastInt = (ipInt & subnetMaskInt) | (~subnetMaskInt);
returnthis.intToIp(broadcastInt);
}
onMethodCall(call: MethodCall, result: MethodResult): void {
switch (call.method) {
case"wifiName":
this.getWifiName().then(data => {
result.success(data || null);
});
break;
case"wifiBSSID":
this.getWifiBSSID().then(data => {
// 失败时返回默认 MAC 地址
result.success(data || '02:00:00:00:00:00');
});
break;
// ... 其他方法
}
}
class _MyHomePageState extends State<MyHomePage> {
final NetworkInfo _networkInfo = NetworkInfo();
String _connectionStatus = 'Unknown';
Future<void> _initNetworkInfo() async {
String? wifiName, wifiBSSID, wifiIPv4;
try {
// 鸿蒙平台特殊处理
if (Platform.operatingSystem == 'ohos') {
wifiName = await _networkInfo.getWifiName();
wifiBSSID = await _networkInfo.getWifiBSSID();
}
wifiIPv4 = await _networkInfo.getWifiIP();
setState(() {
_connectionStatus = 'Wifi Name: $wifiName\n'
'Wifi BSSID: $wifiBSSID\n'
'Wifi IPv4: $wifiIPv4\n';
});
} catch (e) {
print('获取网络信息失败: $e');
}
}
}
// 权限请求(主要针对 Android/iOS)
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS || Platform.operatingSystem == 'ohos')) {
final permissionStatus = await Permission.locationWhenInUse.request();
if (permissionStatus.isGranted) {
wifiBSSID = await _networkInfo.getWifiBSSID();
} else {
// 鸿蒙平台权限被拒绝时的特殊处理
if (Platform.operatingSystem == 'ohos') {
try {
wifiBSSID = await _networkInfo.getWifiBSSID();
} catch (e) {
wifiBSSID = 'Unauthorized to get Wifi BSSID';
}
}
}
}
在 module.json5 中添加必要权限:
{
"requestPermissions": [
{
"name": "ohos.permission.GET_WIFI_INFO",
"reason": "$string:wifi_info_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.GET_NETWORK_INFO",
"reason": "$string:network_info_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
},
{
"name": "ohos.permission.INTERNET",
"reason": "$string:internet_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
在 string.json 中添加权限说明:
{
"string": [
{
"name": "wifi_info_reason",
"value": "获取WiFi信息用于网络状态显示"
},
{
"name": "network_info_reason",
"value": "获取网络信息用于连接状态检测"
},
{
"name": "internet_reason",
"value": "访问网络用于数据传输"
}
]
}
module.json5 中声明wifiManager 而非 Android 的 WifiManager// 建议的错误处理模式
try {
let result = await wifiManager.getLinkedInfo();
return result.ssid || null;
} catch (error) {
console.error("获取WiFi信息失败:", error);
return null;
}
Future<String?> _safeGetNetworkInfo(Future<String?> Function() getter, String errorMsg) async {
try {
return await getter();
} on PlatformException catch (e) {
developer.log(errorMsg, error: e);
return 'Failed to get network info';
}
}
if (Platform.operatingSystem == 'ohos') {
// 鸿蒙特定处理逻辑
} else if (Platform.isAndroid) {
// Android 特定处理逻辑
}
Future<bool> _checkPermissions() async {
if (Platform.operatingSystem == 'ohos') {
// 鸿蒙权限检查逻辑
return true; // 简化示例
}
return await Permission.locationWhenInUse.isGranted;
}
Network Info Plus 的鸿蒙适配展示了如何将 Flutter 插件扩展到新平台的完整流程。通过合理的架构设计、详细的错误处理和平台特定的优化,可以为鸿蒙用户提供与其他平台一致的网络信息获取体验。
在实际开发中,建议:
这种跨平台适配的经验也可以应用到其他 Flutter 插件的鸿蒙适配工作中。