You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取WiFi热点列表?Android设备能否无定位权限获取可用SSID?

问题1:如何获取WiFi热点列表?

要在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_LOCATIONACCESS_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);
    
问题2:需要获取当前Android设备可连接的所有WiFi热点的SSID,请问应用能否在不获取定位权限的情况下实现该功能?

这个问题得分不同Android版本来具体分析:

  • Android 6.0(API 23)之前:完全可以!只需要ACCESS_WIFI_STATECHANGE_WIFI_STATE这两个权限,不用申请定位权限就能获取完整的WiFi热点列表。

  • Android 6.0 - Android 9(API 23 - 28):不行。这几个版本的系统把WiFi扫描结果和定位权限绑定了,必须获取ACCESS_FINE_LOCATIONACCESS_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设备基本都是6.0以上,想要不依赖定位权限获取所有热点SSID,只有Android 12及以上的设备,通过NEARBY_WIFI_DEVICES权限才能实现,其他版本都必须要有定位权限。

内容的提问来源于stack exchange,提问作者Vova

火山引擎 最新活动