二、获取wifi列表并连接wifi

上一篇博客说到了Android打开WIFI的方式, 现在继续来说说如何获取wifi列表并连接wifi。


一、获取wifi列表

获取wifi列表需要用wifiManager.startScan();进行扫描,扫描结果的列表使用List<ScanResult> 保存

扫描步骤:

wifiManager.startScan(); //开启扫描

scanResultList = wifiManager.getScanResults(); // 扫描返回结果列表

注意:因为startScan是异步的,如果一直扫描,scanResultList中有可能会有些热点名称是重复的,其实是同一个热点,这时需要进行下过滤。

下面附上ScanResult的字段说明:

BSSID:fc:e3:3c:4e:f0:34

capabilities:[WPA-PSK-TKIP][ESS]   加密方案

frequency:2412

level:-48 ->信号的强弱标志(单位dBm分贝毫伏)

SSID:ChinaNet-kgdp ->我们平时输入的wifi名称

timestamp:238673772811

describeContents():0

 

level根据数值可以分为5个等级的信号强弱:

Level>-50           信号最强4

-50<Level<-65  信号3

-65<Level<-75  信号2

-75<Level<-90  信号1

-90<Level          信号0


二、连接WIFI

连接wifi分两种,已经配置过的wifi以及未配置过的wifi

1、连接已经配置过的wifi

检查是否已经配置过该wifi,通过WifiManager获取已经配置的wifi列表

List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();

传入要连接的wifiSSID(即wifi名称,匹配得到则不用输入密码即可连接,匹配不到则要输入密码才能连接)

这里需要注意的是:WifiConfiguration里封装的wifiSSID是包含双引号的,而ScanResultSSID是不包含双引号的,这里进行遍历比较时需要注意!对于连接已经配置过的wifi,这里遍历的结果返回一个WifiConfiguration的对象,拿来实现连接;另外这里的wifiManager已经存在了要连接的wifinetworkId,所以不用重新调用wifiManageraddNetwork方法,我们曾经出现过一个问题就是测试用久之后wifi连接会变得很慢,原因就是我们一每次连接都调用了addNetwork方法,引起缓存过多,所以这里切记不能乱用addNetwork。

下面来看看代码实现:

/**
 * 已有配置链接
 * 
 * @param wf
 * @return
 */
public boolean Connect(WifiConfiguration wf) {
    if (!this.OpenWifi()) {
        return false;
    }
    // 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句,即当状态为WIFI_STATE_ENABLING时,让程序在while里面跑
    while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
        try {
            // 为了避免程序一直while循环,让它睡个100毫秒在检测……
            Thread.currentThread();
            Thread.sleep(100);
        } catch (InterruptedException ie) {
        }
    }
    boolean bRet = wifiManager.enableNetwork(wf.networkId, true);
    wifiManager.saveConfiguration();
    return bRet;
}
  

2、连接未经配置过的wifi

输入密码,根据密码创建一个配置信息类

WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);

注:这里的typewifi的加密类型,加密类型查看源码有

/** 
 * 加密类型 
 *  
 * @author Administrator 
 *  
 */  
public enum WifiCipherType {  
    WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID  
}  

一般使用WIFICIPHER_WPA这种加密方式,还有web以及无密码的方式。


然后调用addNetwork把配置信息加入WifiManager(这里返回networkId ),加入后默认是DISABLED(即断开状态的),还要再调用WifiManager.enableNetwork(int netId, boolean disableOthers)去启用,这里传入参数addNetwork方法返回的networkId ,就能启动连接了,布尔值传入true,关闭别的网络,代码:


/** 
 * 无配置记录链接方式 
 *  
 * @param SSID 
 * @param Password 
 * @param Type 
 * @return true or false 
 */  
public boolean Connect(String SSID, String Password, WifiCipherType Type) {  
    if (!this.OpenWifi()) {  
        return false;  
    }  
    // 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句  
    while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {  
        try {  
            // 为了避免程序一直while循环,让它睡个100毫秒在检测……  
            Thread.currentThread();  
            Thread.sleep(100);  
        } catch (InterruptedException ie) {  
        }  
    }  
   
    WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);  
    int netID = wifiManager.addNetwork(wifiConfig);  
    boolean bRet = wifiManager.enableNetwork(netID, true);  
    wifiManager.saveConfiguration();  
    return bRet;  
}  


注意点:

1、首先权限,权限请参考上一篇博客:《一、Android打开WIFI》

2、个别手机如果获取不到wifi列表很可能就是权限有问题,请检查权限。

3、无论是获取wifi列表还是连接wifi, 都要先打开wifi。


好了,获取wifi列表与wifi连接就说到这里,下篇博客我们再说下《Android开启wifi热点》

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中获取连接WiFi需要使用Android原生代码,可以通过Unity的Android插件来实现。下面是一个简单的例子: 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值