Unity 检测网络-判断当前(Android/Windows平台)设备是否连接了指定WiFi

判断设备是否连接了特定的网络

    • 1.Unity 脚本
    • 2.Unity AndroidManifest.xml文件
      • ①改个设置
      • ②补充权限语句

1.Unity 脚本

using UnityEngine;
using System.Collections;
using System.Diagnostics;
using Debug = UnityEngine.Debug;
using UnityEngine.UI;#if UNITY_ANDROID && !UNITY_EDITOR
using UnityEngine.Android;
#endifpublic class WiFiChecker : MonoBehaviour
{public string targetWiFiName = "YourWiFiName";public float checkInterval = 5f;private string currentSSID = "Unknown";private bool isInitialized = false;public GameObject ObjwifiTip;public Text TipText;void Start(){InitializeWiFiChecker();StartCoroutine(CheckWiFiPeriodically());}private void InitializeWiFiChecker(){
#if UNITY_ANDROID && !UNITY_EDITOR// 检查并请求Android权限if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation)){Debug.Log("请求网络访问权限...");Permission.RequestUserPermission(Permission.FineLocation);}
#endifisInitialized = true;}private IEnumerator CheckWiFiPeriodically(){// 等待初始化完成yield return new WaitUntil(() => isInitialized);while (true){yield return new WaitForSeconds(checkInterval);yield return StartCoroutine(GetCurrentSSIDCoroutine());}}private IEnumerator GetCurrentSSIDCoroutine(){
#if UNITY_EDITOR// 在编辑器中模拟//currentSSID = GetWindowsWiFiSSID();currentSSID = "Editor_Simulation_Mode";
#elif UNITY_STANDALONE_WIN// Windows平台currentSSID = GetWindowsWiFiSSID();
#elif UNITY_STANDALONE_OSX// macOS平台currentSSID = GetMacWiFiSSID();
#elif UNITY_ANDROID// Android平台currentSSID = GetAndroidWiFiSSID();
#elsecurrentSSID = "Unsupported Platform";
#endifUseName(currentSSID);yield return null;}private string GetWindowsWiFiSSID(){try{Process process = new Process();process.StartInfo.FileName = "netsh";process.StartInfo.Arguments = "wlan show interfaces";process.StartInfo.UseShellExecute = false;process.StartInfo.RedirectStandardOutput = true;process.StartInfo.CreateNoWindow = true;process.Start();string output = process.StandardOutput.ReadToEnd();process.WaitForExit();// 解析SSIDstring[] lines = output.Split('\n');foreach (string line in lines){if (line.Trim().StartsWith("SSID")){int colonIndex = line.IndexOf(':');if (colonIndex > 0){string ssid = line.Substring(colonIndex + 1).Trim();if (!string.IsNullOrEmpty(ssid) && !ssid.Contains("null")){return ssid;}}}}return "Not Connected";}catch (System.Exception e){Debug.LogWarning($"获取Windows WiFi SSID失败: {e.Message}");return "Error";}}private string GetMacWiFiSSID(){try{Process process = new Process();process.StartInfo.FileName = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport";process.StartInfo.Arguments = "-I";process.StartInfo.UseShellExecute = false;process.StartInfo.RedirectStandardOutput = true;process.StartInfo.CreateNoWindow = true;process.Start();string output = process.StandardOutput.ReadToEnd();process.WaitForExit();// 解析SSIDstring[] lines = output.Split('\n');foreach (string line in lines){if (line.Trim().StartsWith("SSID:")){int colonIndex = line.IndexOf(':');if (colonIndex > 0){return line.Substring(colonIndex + 1).Trim();}}}return "Not Connected";}catch (System.Exception e){Debug.LogWarning($"获取macOS WiFi SSID失败: {e.Message}");return "Error";}}#if UNITY_ANDROID && !UNITY_EDITORprivate string GetAndroidWiFiSSID(){try{// 检查权限if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation)){Debug.LogWarning("需要网络访问权限才能获取WiFi信息");return "Permission Required";}using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")){using (AndroidJavaObject wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi")){using (AndroidJavaObject wifiInfo = wifiManager.Call<AndroidJavaObject>("getConnectionInfo")){string ssid = wifiInfo.Call<string>("getSSID");if (string.IsNullOrEmpty(ssid) || ssid == "<unknown ssid>"){return "Not Connected";}// 移除可能存在的引号if (ssid.StartsWith("\"") && ssid.EndsWith("\"")){ssid = ssid.Substring(1, ssid.Length - 2);}return ssid;}}}}catch (System.Exception e){Debug.LogWarning($"获取Android WiFi SSID失败: {e.Message}");return "Error";}}
#elseprivate string GetAndroidWiFiSSID(){// 在编辑器中模拟Android行为return "Android_Simulated_WiFi";}
#endifpublic void UseName(string name){if (ObjwifiTip != null && ObjwifiTip.activeSelf){return;}if (name == targetWiFiName){Debug.Log($"✅ 网络正确,当前WiFi:{name}");// 网络正确时的逻辑}else{string message = "";if (name == "Error" || name == "Permission Required"){message = $"检测失败: {name}";}else if (name == "Not Connected"){message = "未连接到任何WiFi网络";}else if (name == "Editor_Simulation_Mode"){message = "编辑器模拟模式 - 请在真机或PC上运行";}else if (name == "Unsupported Platform"){message = "不支持的平台";}else{message = $"网络错误,请检查网络后重启软件,当前WiFi:{name}";}Debug.Log(message);if (ObjwifiTip != null && TipText != null){OpenTipPage(message);}}}public void OpenTipPage(string t){if (ObjwifiTip != null){ObjwifiTip.SetActive(true);}if (TipText != null){TipText.text = t;}}public bool IsOnTargetWiFi(){return currentSSID.Equals(targetWiFiName, System.StringComparison.OrdinalIgnoreCase);}public void ManualCheck(){StartCoroutine(GetCurrentSSIDCoroutine());}//// 添加一个关闭提示页面的方法//public void CloseTipPage()//{//    if (ObjwifiTip != null)//    {//        ObjwifiTip.SetActive(false);//    }//}void OnGUI(){GUIStyle style = new GUIStyle(GUI.skin.label);style.fontSize = 16;GUI.Label(new Rect(10, 10, 400, 30), $"当前WiFi: {currentSSID}", style);GUI.Label(new Rect(10, 40, 400, 30), $"目标WiFi: {targetWiFiName}", style);if (GUI.Button(new Rect(10, 70, 150, 30), "手动检测")){ManualCheck();}// 添加关闭按钮if (ObjwifiTip != null && ObjwifiTip.activeSelf){if (GUI.Button(new Rect(10, 110, 150, 30), "关闭提示")){CloseTipPage();}}}
}

2.Unity AndroidManifest.xml文件

①改个设置

在这里插入图片描述
然后会引擎会自动生成一个xml文件
Assets\Plugins\Android\AndroidManifest.xml

②补充权限语句

在这里插入图片描述
完整文件↓

<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.unity3d.player"xmlns:tools="http://schemas.android.com/tools"><!-- 必需的核心权限 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />	<application><activity android:name="com.unity3d.player.UnityPlayerActivity"android:theme="@style/UnityThemeSelector"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="unityplayer.UnityActivity" android:value="true" /></activity></application>
</manifest>

发布后在Android端运行即可看到应用系统权限请求弹窗,这时就可以对网络状态进行判断了

备注:
测试发现存在一个问题()。
原因分析
Android系统延迟:Android的WiFi状态更新不是实时的,系统需要时间检测到网络断开
连接信息缓存:WifiInfo 对象中的信息不是实时更新的,会有短暂延迟
心跳检测机制:你的检测间隔是1秒,加上系统延迟,总共可能需要6-9秒

测试问题分析
当离开指定WiFi区域时,系统的WiFi图标已经消失后6~9s之后,软件的检测才显示WiFi丢失Android系统延迟-Android的WiFi状态更新不是实时的,系统需要时间检测到网络断开,连接信息缓存-WifiInfo 对象中的信息不是实时更新的,会有短暂延迟,心跳检测机制-你的检测间隔是1秒,加上系统延迟,总共可能需要6-9秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/98045.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/98045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过网络强化增强混合IT环境的安全

网络是企业运营的支柱&#xff0c;也是网络犯罪分子和恶意威胁者的主要目标&#xff0c;他们会破坏IT运营的连续性。随着混合云基础设施、远程办公和物联网&#xff08;IoT&#xff09;生态系统的出现&#xff0c;网络边界正在不断扩大&#xff0c;新的漏洞不断产生&#xff0c…

ACP(四):RAG工作流程及如何创建一个RAG应用

RAG的工作原理 你在考试的时候有可能会因为忘记某个概念或公式而失去分数&#xff0c;但考试如果是开卷形式&#xff0c;那么你只需要找到与考题最相关的知识点&#xff0c;并加上你的理解就可以进行回答了。 对于大模型来说也是如此&#xff0c;在训练过程中由于没有见过某个知…

宇视设备视频平台EasyCVR视频设备轨迹回放平台监控摄像头故障根因剖析

监控摄像头的类型繁多&#xff0c;市场上提供了广泛的选择。然而&#xff0c;在使用监控摄像头的过程中&#xff0c;用户可能会遇到云台在很短的时间内出现运转不灵或完全无法转动的问题。这里&#xff0c;我们将对这一常见问题进行深入分析。一、具体的原因&#xff1a; 1、距…

【Uni-App+SSM 宠物项目实战】Day15:购物车添加

大家好!今天是学习路线的第15天,我们正式进入订单与购物车核心模块。昨天完成了商家服务列表的分页加载,今天聚焦“购物车添加”功能——这是连接“商品浏览”与“订单提交”的关键环节,用户可将宠物用品(如粮食、玩具)加入购物车,后续统一结算。 为什么学这个? 购物车…

Java 黑马程序员学习笔记(进阶篇6)

常用的 API1. 正则表达式(1) 题目&#xff1a;贪婪爬取和非贪婪爬取① 贪婪爬取&#xff1a;爬取数据的时候尽可能的多获取数据 ② 非贪婪爬取&#xff1a;爬取数据的时候尽可能的少获取数据 ③ Java中默认的是贪婪爬取 ④ 后面加上 ? 可以转变为非贪婪爬取(2) 捕获分组捕获分…

计算机网络---数据链路层上

文章目录1. 数据链路层的功能2. 组帧2.1 字符填充法2.2 字节填充法2.3 零比特填充法2.4 违规编码2.5 总结3. 差错控制3.1 检错编码3.1.1 奇偶校验3.1.2 循环冗余校验码&#xff08;CRC&#xff09;3.1.3 总结3.2 纠错编码&#xff08;海明校验码&#xff09;3.3 总结4. 流量控制…

机器学习实战项目中,回归与分类模型中该如何科学定义目标变量Y?

前言 在机器学习项目里&#xff0c;目标变量 (Y) 的定义决定了你能解答什么问题&#xff0c;以及模型能给业务带来什么价值。选择不当不仅可能导致模型误差大、偏差严重&#xff0c;还可能让业务决策方向偏离。 本文分两大场景&#xff1a; 供应链项目中的 销量预测&#xff08…

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是动态规划算法的基础入门篇&#xff0c;我将通过三道简单题 一道中等难度的一维动态规划题来带你对动态规划有个初认识&#xff0c;并基本了解动…

深入对比Tomcat与Netty:HTTP请求从网卡到Controller的全链路追踪

我们日常用Spring Boot写的RestController&#xff0c;感觉上就是一个简单的方法&#xff0c;但它背后其实有一套复杂的网络服务在支撑。一个HTTP请求到底是怎么从用户的浏览器&#xff0c;穿过层层网络&#xff0c;最终抵达我们代码里的Controller方法的&#xff1f;理解这个过…

GO学习记录十——发包

记录下不同平台的发包操作和期间遇到的问题 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平台&#xff0c;linux、windows 第二行&#xff0c;配置部署服务器的处理器架构 第三行&#xff0c;输出目标文…

贪心算法与动态规划

1. 什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。 核心思想&#xff1a;“每步都贪心地选择眼前最好的&#xff0c;不去考虑整个未来的长…

学会“读网页”:生成式 AI 在足球赛事信息整理中的实战

逐步教程&#xff08;Step-by-Step&#xff09; — 适合初学者与教学类文章 背景&#xff08;为什么要这样做&#xff09; 对于足球迷、资讯编辑与数据分析师来说&#xff0c;最快、最准确把握一场比赛的核心信息至关重要&#xff1a;比分、关键事件&#xff08;进球、点球、红…

BM3D 图像降噪快速算法的 MATLAB 实现

BM3D 图像降噪快速算法的 MATLAB 实现1. 快速 BM3D 算法流程&#xff08;概述&#xff09;步骤操作加速技巧① 分组块匹配 堆叠FFT 互相关② 协同滤波3D 变换 硬阈值FFT 沿第三维③ 聚合加权平均稀疏矩阵累加 2. 核心函数&#xff08;单文件版&#xff09; 保存为 bm3d_fast.…

Go的schedt调度(runtime/proc.go)

1. 创建go的入口函数// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服务器配置转发网络访问

配置文档&#xff1a;Ubuntu 服务器转发网络访问 一、网络拓扑以以下网络拓扑为示例Ubuntu 服务器&#xff08;两个网卡&#xff09; eth1 10.66.71.222 &#xff08;接入内网&#xff09;eno1 192.168.2.100 &#xff08;直连相机&#xff09; 相机ip 192.168.2.1 Windows 客…

为什么企业需要高防IP

1. 抵御日益猖獗的DDoS攻击 现代DDoS攻击规模已突破Tbps级别 传统防火墙无法应对大规模流量攻击 高防IP采用分布式清洗中心&#xff0c;可轻松抵御300Gbps以上的攻击流量 2. 保障业务连续性 网络中断1小时可能造成数百万损失 高防IP确保服务99.99%可用性 智能切换机制实…

CSS基础 - 选择器备忘录 --笔记5

目录基础选择器组合器伪类选择器属性选择器选择器可以选中页面上的特定元素并为其指定样式。 CSS有多种选择器。 基础选择器 标签选择器 – tagname&#xff1a;匹配目标元素的标签名。优先级是0,0,1。如&#xff1a;p、h1、div类选择器 – .class&#xff1a;匹配class属性中…

自动驾驶中的传感器技术46——Radar(7)

卫星雷达&#xff08;又称为分布式雷达&#xff09;主要讲当前雷达的雷达信号处理计算以及雷达目标相关的一些感知算法都迁移到中央域控进行&#xff0c;雷达端基本只负责数据采集&#xff0c;这样做的影响如下&#xff1a; 雷达端成本与功耗降低&#xff1b; 雷达端采样得到的…

【论文阅读】Diff-Privacy: Diffusion-based Face Privacy Protection

基于扩散模型的人脸隐私保护方法——DiffPrivacy&#xff0c;解决了两类人脸隐私任务&#xff1a;匿名化&#xff08;anonymization&#xff09;和视觉身份信息隐藏&#xff08;visual identity information hiding&#xff09;。1. 研究背景随着人工智能和大数据技术的普及&am…

React 原理篇 - 深入理解虚拟 DOM

一、什么是虚拟 DOM&#xff1f; 在前端开发中&#xff0c;“虚拟 DOM” 是一个高频出现的术语&#xff0c;尤其在 React 生态中被广泛讨论。但很多开发者对它的理解往往停留在 “JS 对象” 这个表层认知上。 实际上&#xff0c;虚拟 DOM 是一种编程概念—— 在这个概念里&…