Xamarin Forms如何获取Android设备的WiFi MAC地址?
Android设备获取真实WiFi MAC地址的解决方案
为什么旧脚本拿到的MAC不对?
从Android 6.0(API 23)开始,Google就限制了第三方应用获取真实WiFi MAC地址的权限:
- 调用
WifiInfo.getMacAddress()会返回固定虚拟地址02:00:00:00:00:00 - 到了Android 10(API 29)及以上,这个接口直接返回
null
你用的旧脚本适配的是早期Android版本,自然拿不到和系统设置一致的真实MAC。
分版本处理方案(仅针对Android)
1. Android 9及以下(API ≤28)
可以通过读取系统文件获取真实MAC,步骤如下:
- 在Android项目的
AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 用Xamarin.Forms依赖服务实现读取逻辑:
共享项目定义接口:
public interface IMacAddressHelper { string GetRealWifiMac(); }
Android项目实现接口:
[assembly: Dependency(typeof(MacAddressHelper))] namespace YourApp.Droid { public class MacAddressHelper : IMacAddressHelper { public string GetRealWifiMac() { try { const string macPath = "/sys/class/net/wlan0/address"; if (File.Exists(macPath)) { return File.ReadAllText(macPath).Trim(); } } catch (Exception) { // 处理权限不足或文件不存在的异常 } return null; } } }
在共享项目中调用:
var macAddress = DependencyService.Get<IMacAddressHelper>().GetRealWifiMac();
2. Android 10及以上(API ≥29)
系统彻底禁止第三方应用获取真实MAC,只能用替代标识:
- Android ID:不需要特殊权限,重启设备不会改变,仅恢复出厂设置会重置:
public string GetAndroidId() { return Android.OS.Build.Serial; // 或使用:Settings.Secure.GetString(Android.App.Application.Context.ContentResolver, Settings.Secure.AndroidId); }
- IMEI/MEID:需要
READ_PHONE_STATE权限,Android 10+还需额外申请特殊权限,且部分平板无IMEI,不推荐作为唯一标识。
适配建议
针对仓库设备的场景:
- 先统计现有设备的Android版本,分批次处理
- 若存在Android 10+设备,优先用Android ID作为设备标识,配合后台记录持有人及最后使用者信息
- 务必在运行时动态申请必要权限,不要仅依赖Manifest的静态声明
内容的提问来源于stack exchange,提问作者Elgate
相关产品推荐
相关产品推荐

