安卓wifi基础功能

本文详细介绍了安卓平台上的WiFi功能开发,包括涉及的广播通知、相关属性和概念、热点加密类型,以及如何打开关闭WiFi、扫描周围热点、获取已连接过的热点、连接指定热点等开发细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

2 涉及到的广播通知
  • WifiManager.WIFI_STATE_CHANGED_ACTION ——wifi开关变化广播

  • WifiManager.SCAN_RESULTS_AVAILABLE_ACTION——热点扫描结果通知广播

  • WifiManager.SUPPLICANT_STATE_CHANGED_ACTION——热点连接结果通知广播

  • WifiManager.NETWORK_STATE_CHANGED_ACTION——网络状态变化广播(与上一广播协同完成连接过程通知)

3 相关属性及概念
  • networkId——连接某个wifi热点时,系统会为该热点生成一个networkId

  • ssid——wifi热点名称,可重复

  • bssid——类似于mac地址,与ssid一起可作为热点的唯一标识,同时该属性每个热点唯一不重复

4 热点加密类型

常见及需要处理的热点,包括以下3大类:

  • open——开放型网络,即无加密,可直接连接

  • wep——采用wep加密类型的热点,已过时,不安全,容易被破解,目前使用率已不足10%

  • wpa/wpa2——目前使用最广泛,相对最安全,破解难度最大的加密类型

二 开发细节
1 获取WifiManager入口类实例:

wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE);

  • 1

  • 2

2 打开及关闭wifi

wifiManager.setWifiEnabled(true)

  • 1

true表示打开wifi开关,false表示关闭,该方法的返回值仅代表操作是否成功,不代表wifi状态的变化;

通过监听广播WifiManager.WIFI_STATE_CHANGED_ACTION ,来判断真正的wifi开关变化,该广播带有一个int型的值来表示wifi状态:

int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); switch (wifistate) { case WifiManager.WIFI_STATE_DISABLED: //wifi已关闭 break; case WifiManager.WIFI_STATE_ENABLED: //wifi已打开 break; case WifiManager.WIFI_STATE_ENABLING: //wifi正在打开 break; default: break; }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

3 周围热点扫描

wifiManager.startScan()

  • 1

以上方法为开始扫描的接口,其返回值代表操作是否成功,扫描结果通过另外一个接口获取:

List<ScanResult> results = wifiManager.getScanResults();

  • 1

一般在主动调用startScan之后,大概2秒左右,会收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)广播通知:

boolean isScanned = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true);

  • 1

上面的值表示,扫描结果是否已可用,若可用,则可以使用getScanResults获取结果,在结果没有就绪之前,会返回null。

4 获取已连接过的热点

所有已经连接过的热点,都会存在本地一个文件中,一般路径为/data/misc/wifi/wpa_supplicant.conf,而在程序中获取则通过以下接口:

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

  • 1

获取到的WiFiConfiguration对象中,只有ssid和networkId是一定有的,可以用于直接连接该热点,其他信息如bssid,密钥等信息基本都是空的。

5 获取当前wifi连接信息

WifiInfo info = wifiManager.getConnectionInfo();

  • 1

该对象代表当前已连接的热点,信息,无连接时返回null;

该对象可获取包括ssid,bssid,networkId等信息。

6 连接指定热点

连接一个未连接过的热点时,需3步:

1)创建一个配置:WifiConfiguration

public WifiConfiguration createConfiguration(AccessPoint ap) { String SSID = ap.getSsid(); WifiConfiguration config = new WifiConfiguration(); config.SSID = "\"" + SSID + "\""; String encryptionType = ap.getEncryptionType(); String password = ap.getPassword(); if (encryptionType.contains("wep")) { /** * special handling according to password length is a must for wep */ int i = password.length(); if (((i == 10 || (i == 26) || **《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】** (i == 58))) && (password.matches("[0-9A-Fa-f]*"))) { config.wepKeys[0] = password; } else { config.wepKeys[0] = "\"" + password + "\""; } config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.SHARED); config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } else if (encryptionType.contains("wpa")) { config.preSharedKey = "\"" + password + "\""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); } else { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } return config; }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

2)生成一个networkId

WifiConfiguration config = createConfiguration(ap); /** * networkId is bigger than 0 in most time, 0 in few time and smaller than 0 in no time */ int networkId = networkId = wifiManager.addNetwork(config);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值