判斷設備是否連接了特定的網絡
- 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秒 |