You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity安卓项目:如何获取周边WiFi热点及信号强度?

获取安卓设备周边所有WiFi热点及信号强度(Unity项目)

嘿,我完全懂你的需求——之前做室内WiFi定位的Unity项目时,也卡在过“只能拿到当前连接的WiFi信息”这一步,刚好可以给你分享下可行的方案:

一、原生C#结合安卓API实现(无需第三方资源)

Unity自带的C# API确实没有直接扫描周边WiFi热点的功能,因为这属于安卓系统层面的硬件访问能力,得通过Unity的AndroidJavaInterface相关类来调用安卓原生的WifiManager API。具体步骤如下:

1. 配置安卓权限

首先要在Unity的安卓Manifest文件中添加必要权限(如果用Unity 2019+,可以在Player Settings > Publishing Settings > Build里勾选对应的权限,或者手动修改Manifest):

  • ACCESS_WIFI_STATE:获取WiFi状态的基础权限
  • ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION:安卓6.0+之后,扫描WiFi需要定位权限(因为WiFi热点信息属于位置相关数据)
  • 安卓10+还需要ACCESS_BACKGROUND_LOCATION(如果要在后台持续扫描的话)

2. 核心代码示例

下面是一段可以直接在Unity中使用的C#代码,用来调用安卓原生接口扫描并获取所有WiFi热点:

using UnityEngine;

public class WifiScanner : MonoBehaviour
{
    private AndroidJavaObject wifiManager;

    void Start()
    {
        // 获取安卓系统的WifiManager实例
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        wifiManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "wifi");
    }

    public void ScanSurroundingWifi()
    {
        // 启动WiFi扫描
        bool scanStarted = wifiManager.Call<bool>("startScan");
        if (!scanStarted)
        {
            Debug.LogError("WiFi扫描启动失败,请检查权限是否配置正确");
            return;
        }

        // 延迟获取扫描结果(扫描需要一点时间完成)
        Invoke(nameof(GetScanResults), 1.5f);
    }

    private void GetScanResults()
    {
        // 获取扫描到的所有WiFi热点列表
        AndroidJavaObject scanResults = wifiManager.Call<AndroidJavaObject>("getScanResults");
        int resultCount = scanResults.Call<int>("size");

        for (int i = 0; i < resultCount; i++)
        {
            AndroidJavaObject singleResult = scanResults.Call<AndroidJavaObject>("get", i);
            string ssid = singleResult.Call<string>("getSSID");
            string bssid = singleResult.Call<string>("getBSSID");
            int signalLevel = singleResult.Call<int>("level");
            
            // 可选:将原始信号强度(dBm)转换为直观的百分比
            int signalPercent = CalculateSignalPercent(signalLevel);

            Debug.Log($"WiFi热点:{ssid} | 硬件地址:{bssid} | 信号强度:{signalLevel}dBm | 相对强度:{signalPercent}%");
        }
    }

    // 自定义信号强度转百分比的逻辑
    private int CalculateSignalPercent(int rssi)
    {
        if (rssi <= -100) return 0;
        if (rssi >= -50) return 100;
        return 2 * (rssi + 100);
    }
}

注意事项

  • 安卓版本限制:安卓8.0(API 26)之后,startScan()的调用频率会被系统限制(每2分钟最多4次),后台扫描需要额外申请权限
  • 动态权限:安卓6.0+必须在运行时弹窗申请定位权限,不能仅靠Manifest配置
  • 扫描延迟:调用startScan()后不能立刻获取结果,需要等待1-2秒,示例中用Invoke做了延迟处理

二、Unity Asset Store的现成资源

如果不想自己折腾原生API的兼容性和权限问题,Asset Store里有不少封装好的工具可以直接用:

  • WiFi Scanner for Android:专门针对安卓平台,封装了WiFi扫描、信号强度获取的全流程,还处理了不同安卓版本的权限适配
  • Indoor Positioning System:部分室内定位插件自带WiFi扫描模块,不仅能获取热点信息,还能直接提供基于WiFi信号的定位计算逻辑
  • Native WiFi Plugin:支持多平台,安卓端功能完善,能快速获取周边所有WiFi热点的详细数据

这类资源的优势是节省开发时间,已经处理了很多细节问题(比如权限申请、版本兼容、扫描频率控制),适合快速迭代项目。

补充说明

你之前找到的“获取当前连接WiFi信号强度”的方法,一般是调用getConnectionInfo()接口,只能拿到当前已连接的网络;而扫描周边热点必须用getScanResults()接口,这就是两者的核心区别。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:43:11