如何获取WiFi热点列表?Android设备能否无定位权限获取可用SSID?
要在Android设备上获取可连接的WiFi热点列表,你可以借助系统的WifiManager类来实现,大致步骤如下:
声明必要权限:首先在
AndroidManifest.xml里添加基础权限:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />另外,Android 6.0(API 23)及以上版本需要动态申请定位权限(
ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION),Android 12(API 31)及以上可以用NEARBY_WIFI_DEVICES权限替代(后面问题2会详细说明)。获取WifiManager实例:通过系统服务获取核心管理类:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);发起WiFi扫描:调用
startScan()方法触发扫描,但注意Android 10(API 29)及以上对这个方法的调用场景有严格限制,只能用于连接已保存的热点或用户主动触发的操作。接收扫描结果:注册广播接收器监听扫描完成的事件,然后提取热点信息:
// 动态注册广播接收器 IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); BroadcastReceiver scanReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isScanSuccess = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false); if (isScanSuccess) { List<ScanResult> hotspots = wifiManager.getScanResults(); // 遍历热点列表,获取SSID等信息 for (ScanResult hotspot : hotspots) { String ssid = hotspot.SSID; // 这里可以处理每个热点的信息 Log.d("WiFi热点", "SSID: " + ssid); } } // 记得用完注销接收器,避免内存泄漏 unregisterReceiver(this); } }; registerReceiver(scanReceiver, filter);
这个问题得分不同Android版本来具体分析:
Android 6.0(API 23)之前:完全可以!只需要
ACCESS_WIFI_STATE和CHANGE_WIFI_STATE这两个权限,不用申请定位权限就能获取完整的WiFi热点列表。Android 6.0 - Android 9(API 23 - 28):不行。这几个版本的系统把WiFi扫描结果和定位权限绑定了,必须获取
ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限,并且得到用户授权后,才能拿到完整的热点列表;如果没有定位权限,getScanResults()只会返回设备已经连接过的热点,甚至是空列表。Android 10(API 29)及以上:
- Android 10到Android 11(API 29 - 30):依然必须要有定位权限,否则完全无法获取任何扫描结果,而且
startScan()的调用场景还被进一步限制了。 - Android 12(API 31)及以上:新增了
NEARBY_WIFI_DEVICES权限,这个权限可以替代定位权限来获取WiFi热点列表,但有个前提:你需要在权限声明里加上android:usesPermissionFlags="neverForLocation",明确告知系统你的应用不会用这个权限来获取用户位置,同时这个权限只允许用于连接热点、分享热点等特定场景,不能用于定位相关功能。如果符合这些条件,就可以不用定位权限拿到热点SSID了。
- Android 10到Android 11(API 29 - 30):依然必须要有定位权限,否则完全无法获取任何扫描结果,而且
总结一下:现在主流的Android设备基本都是6.0以上,想要不依赖定位权限获取所有热点SSID,只有Android 12及以上的设备,通过NEARBY_WIFI_DEVICES权限才能实现,其他版本都必须要有定位权限。
内容的提问来源于stack exchange,提问作者Vova




