Unity Android 之 获取 Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理

 

 

Unity Android 之 获取 Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理

 

目录

Unity Android 之 获取 Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

Android 端:

Unity 端

六、关键代码

Android 端

Unity  端


 

一、简单介绍

Unity Android 开发上会用到的技术简单整理,方便自己日后查看,能帮助到大家就更好了。

本节介绍,Unity 开发中,把从 Android 获取手机设备的获取 Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理封装给Unity调用,方法不唯一,欢迎指正。

 

二、实现原理

1、getSystemService(Context.WIFI_SERVICE) 获取 Wifi 管理器 WifiManager

2、WifiManager.isWifiEnabled() 获取 Wifi 状态

3、WifiManager.setWifiEnabled(true)/WifiManager.setWifiEnabled(false) 设置 Wifi 开关

4、使用广播监听 WifiManager.WIFI_STATE_CHANGED_ACTION 网络Wifi 的状态变化

5、打包成 aar ,Unity 调用 aar 的封装好的接口

 

三、注意事项

1、需要添加 Wifi 相关权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

 

四、效果预览

 

五、实现步骤

Android 端:

1、新建一个Android Library 模块,其他默认设置就好

 

2、在模块中新建两个脚本,WifiStateUtil 封装各个功能,WifiStateInterface 一个接口函数,Wifi 状态变化的接口

 

3、脚本编辑 OK,Build - Make Module ‘xxxx’,打包 aar

 

4、打包成功,build 文件夹outputs/aar中就会 有对应的 aar 生成

 

Unity 端

1、把 Android 打包的 aar 导入 Unity

 

2、在场景中布局UI,Toggle 显示设置 Wifi 状态

 

3、在 Unity工程中,新建脚本,编辑对应功能

 

4、把 TestBluetoothStateWrapper 挂载到场景中,并对应赋值

 

5、运行场景,没有问题,即可打包到真机上测试

 

6、真机上的测试效果如上

 

六、关键代码

Android 端

1、WifiStateUtil

package com.example.wifistatewrapper;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.Toast;

public class WifiStateUtil {

    private static final String TAG = "Main_WifiStateUtil";

    private WifiManager _WifiManager;
    private Context _Context;
    private WifiStateBroadcastReceive mReceive;
    private WifiStateInterface mWifiStateInterface;


    public void Init(WifiStateInterface wifiStateInterface){

        _Context = getActivity();
        _WifiManager = (WifiManager)_Context.getSystemService(Context.WIFI_SERVICE);
        mWifiStateInterface = wifiStateInterface;
    }

    /**
     * 获取 Wifi 状态
     * @return
     */
    public boolean getWifiState() {

        return _WifiManager.isWifiEnabled();
    }

    /**
     * 打开 Wifi
     * @return
     */
    public boolean openWifi() {
        if (getWifiState()) return true;

        return _WifiManager.setWifiEnabled(true);
    }

    /**
     * 关闭 Wifi
     * @return
     */
    public boolean cloaseWifi() {
        if (!getWifiState()) return true;

        return _WifiManager.setWifiEnabled(false);
    }


    /**
     * 注册监听 Wifi 状态改变的广播
     */
    public void registerWifiReceiver(){
        if(mReceive == null){
            mReceive = new WifiStateBroadcastReceive();
        }
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        _Context.registerReceiver(mReceive, intentFilter);
    }

    /**
     * 取消注册监听 Wifi 状态改变的广播
     */
    public void unregisterWifiReceiver(){
        if(mReceive != null){
            _Context.unregisterReceiver(mReceive);
            mReceive = null;
        }
    }

    /**
     * Wifi 状态广播
     */
    class WifiStateBroadcastReceive extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            switch (wifiState) {
                case WifiManager.WIFI_STATE_DISABLED:
                    //Toast.makeText(context , "Wifi已关闭", Toast.LENGTH_SHORT).show();
                    Log.i(TAG, "onReceive: "+"Wifi已关闭");
                    if (mWifiStateInterface != null){

                        mWifiStateInterface.onWifiStateOFF();
                    }
                    break;
                case WifiManager.WIFI_STATE_DISABLING:
                    //Toast.makeText(context , "Wifi正在关闭", Toast.LENGTH_SHORT).show();
                    Log.i(TAG, "onReceive: "+"Wifi正在关闭...");
                    break;
                case WifiManager.WIFI_STATE_ENABLED:
                    //Toast.makeText(context , "Wifi已打开", Toast.LENGTH_SHORT).show();
                    Log.i(TAG, "onReceive: "+"Wifi已打开");
                    if (mWifiStateInterface != null){

                        mWifiStateInterface.onWifiStateON();
                    }
                    break;
                case WifiManager.WIFI_STATE_ENABLING:
                    //Toast.makeText(context , "Wifi正在打开", Toast.LENGTH_SHORT).show();
                    Log.i(TAG, "onReceive: "+"Wifi正在打开...");
                    break;
                case WifiManager.WIFI_STATE_UNKNOWN:

                    break;
            }
        }
    }


    // 设置一个 Activity 参数
    private Activity _unityActivity;

    // 通过反射获取 Unity 的 Activity 的上下文
    Activity getActivity(){

        if(null == _unityActivity){

            try{

                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");

                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);

                _unityActivity = activity;

            }catch (ClassNotFoundException e){

                e.printStackTrace();

            }catch (IllegalAccessException e){

                e.printStackTrace();

            }catch (NoSuchFieldException e){

                e.printStackTrace();

            }

        }

        return _unityActivity;

    }
}

 

2、WifiStateInterface

package com.example.wifistatewrapper;

public interface WifiStateInterface {
    void onWifiStateON();
    void onWifiStateOFF();
}

 

3、AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wifistatewrapper" >
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
</manifest>

 

Unity  端

1、WifiStateWrapper

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace AndroidWrapper
{
    public class WifiStateWrapper : MonoSingleton<WifiStateWrapper>
    {
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="VoiceVolumnChangedListener"></param>
        public void Init(Action OnWifiStateONListener, Action OnWifiStateOFFListener)
        {

#if UNITY_EDITOR

#else

            MAndroidJavaObject.Call("Init", new WifiStateInterface(OnWifiStateONListener, OnWifiStateOFFListener));
            registerWifiReceiver();
#endif

        }

        /// <summary>
        /// 获取 Wifi 当前状态
        /// </summary>
        /// <returns></returns>
        public bool getWifiState()
        {
            return MAndroidJavaObject.Call<bool>("getWifiState");
        }

        /// <summary>
        /// 打开 Wifi
        /// </summary>
        /// <returns></returns>
        public bool openWifi()
        {
            return MAndroidJavaObject.Call<bool>("openWifi");
        }

        /// <summary>
        /// 关闭 Wifi 
        /// </summary>
        /// <returns></returns>
        public bool cloaseWifi()
        {

            return MAndroidJavaObject.Call<bool>("cloaseWifi");
        }

        #region 私有方法

        /// <summary>
        /// 注册蓝牙状态监听
        /// </summary>
        void registerWifiReceiver()
        {
            MAndroidJavaObject.Call("registerWifiReceiver");
        }

        /// <summary>
        /// 取消注册蓝牙状态监听
        /// </summary>
        void unregisterWifiReceiver()
        {
            MAndroidJavaObject.Call("unregisterWifiReceiver");
        }


        protected override void OnDestroy()
        {
            unregisterWifiReceiver();
            base.OnDestroy();
        }

        #endregion

        #region 私有变量



        AndroidJavaObject _mAndroidJavaObject;

        public AndroidJavaObject MAndroidJavaObject
        {
            get
            {
                if (_mAndroidJavaObject == null)
                {
                    _mAndroidJavaObject = new AndroidJavaObject("com.example.wifistatewrapper.WifiStateUtil");
                }

                return _mAndroidJavaObject;
            }
        }


        #endregion
    }
}

 

2、WifiStateInterface

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace AndroidWrapper
{
    /// <summary>
    /// Wifi 状态变化接听接口
    /// </summary>
    public class WifiStateInterface : AndroidJavaProxy
    {
        /// <summary>
        /// Wifi变化委托事件
        /// </summary>
        Action _mWifiStateON;
        Action _mWifiStateOFF;

        public WifiStateInterface(Action mWifiStateON, Action mWifiStateOFF):base("com.example.wifistatewrapper.WifiStateInterface")
        {
            _mWifiStateON = mWifiStateON;
            _mWifiStateOFF = mWifiStateOFF;
        }

        /// <summary>
        /// Wifi 开启事件
        /// </summary>
        public void onWifiStateON() {
            if (_mWifiStateON != null)
            {
                _mWifiStateON();
            }
        }

        /// <summary>
        /// Wifi 关闭事件
        /// </summary>
        public void onWifiStateOFF() {
            if (_mWifiStateOFF != null)
            {
                _mWifiStateOFF();
            }
        }
    }
}

 

3、TestWifiStateWrapper

using AndroidWrapper;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TestWifiStateWrapper : MonoBehaviour
{
    public Toggle WifiState_Toggle;

    // Start is called before the first frame update
    void Start()
    {
        WifiStateWrapper.Instance.Init(SetOnToggle, SetOffToggle);
        InitToggle();
    }

    /// <summary>
    /// 初始化
    /// </summary>
    void InitToggle()
    {

#if UNITY_EDITOR

        // 获取当前状态
        SetIsOnToggle(Random.Range(0, 2) == 0 ? false : true);
        // 设置监听事件
        WifiState_Toggle.onValueChanged.AddListener((isOn) => {

        });

#else

         // 获取当前状态
        SetIsOnToggle(WifiStateWrapper.Instance.getWifiState());
        // 设置监听事件
        WifiState_Toggle.onValueChanged.AddListener((isOn) => {
            if (isOn == true)
            {
                WifiStateWrapper.Instance.openWifi();

            }
            else
            {
                WifiStateWrapper.Instance.cloaseWifi();
            }
        });

#endif
    }

    void SetOnToggle()
    {
        SetIsOnToggle(true);
    }

    void SetOffToggle()
    {
        SetIsOnToggle(false);
    }

    void SetIsOnToggle(bool isOn)
    {
        WifiState_Toggle.isOn = isOn;
    }
}

 

4、MonoSingleton

using UnityEngine;

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;

    private static readonly object locker = new object();

    private static bool bAppQuitting;

    public static T Instance
    {
        get
        {
            if (bAppQuitting)
            {
                instance = null;
                return instance;
            }

            lock (locker)
            {
                if (instance == null)
                {
                    instance = FindObjectOfType<T>();
                    if (FindObjectsOfType<T>().Length > 1)
                    {
                        Debug.LogError("不应该存在多个单例!");
                        return instance;
                    }

                    if (instance == null)
                    {
                        var singleton = new GameObject();
                        instance = singleton.AddComponent<T>();
                        singleton.name = "(singleton)" + typeof(T);
                        singleton.hideFlags = HideFlags.None;
                        DontDestroyOnLoad(singleton);
                    }
                    else
                        DontDestroyOnLoad(instance.gameObject);
                }
                instance.hideFlags = HideFlags.None;
                return instance;
            }
        }
    }

    protected virtual void Awake()
    {
        bAppQuitting = false;
    }

    protected virtual void OnDestroy()
    {
        bAppQuitting = true;
    }
}

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity获取和连接WiFi需要使用Android原生代码,可以通过UnityAndroid插件来实现。下面是一个简单的例子: 1.创建一个Java类作为插件,实现获取并连接WiFi方法: ``` package com.example.wifiplugin; import android.content.Context; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.util.Log; import java.util.List; public class WifiPlugin { private static final String TAG = "WifiPlugin"; private Context context; private WifiManager wifiManager; public WifiPlugin(Context context) { this.context = context; wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } public void connectToWifi(String ssid, String password) { // Check if WiFi is enabled if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); } // Scan for available WiFi networks List<ScanResult> scanResults = wifiManager.getScanResults(); for (ScanResult scanResult : scanResults) { if (scanResult.SSID.equals(ssid)) { // Connect to selected WiFi network WifiConfiguration wifiConfiguration = new WifiConfiguration(); wifiConfiguration.SSID = "\"" + ssid + "\""; wifiConfiguration.preSharedKey = "\"" + password + "\""; wifiManager.addNetwork(wifiConfiguration); List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks(); for (WifiConfiguration configuration : configurations) { if (configuration.SSID.equals("\"" + ssid + "\"")) { wifiManager.disconnect(); wifiManager.enableNetwork(configuration.networkId, true); wifiManager.reconnect(); break; } } break; } } } } ``` 2.在Unity中调用Java插件: ``` using UnityEngine; using System.Runtime.InteropServices; public class WifiManager : MonoBehaviour { private AndroidJavaObject wifiPlugin; void Start () { // Initialize Java plugin AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = javaClass.GetStatic<AndroidJavaObject>("currentActivity"); wifiPlugin = new AndroidJavaObject("com.example.wifiplugin.WifiPlugin", activity); } public void ConnectToWifi(string ssid, string password) { // Call Java method to connect to WiFi wifiPlugin.Call("connectToWifi", ssid, password); } } ``` 3.在Unity场景中添加一个UI输入框和按钮,用于输入WiFi的SSID和密码,并调用连接WiFi方法: ``` using UnityEngine; using UnityEngine.UI; public class UIManager : MonoBehaviour { public InputField ssidInput; public InputField passwordInput; public WifiManager wifiManager; public void ConnectToWifi() { string ssid = ssidInput.text; string password = passwordInput.text; wifiManager.ConnectToWifi(ssid, password); } } ``` 这样就可以在Unity获取并连接WiFi了。需要注意的是,为了访问WiFi相关的Android API,需要在Unity项目中添加Android权限:ACCESS_WIFI_STATE、CHANGE_WIFI_STATE、ACCESS_NETWORK_STATE、CHANGE_NETWORK_STATE、ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值