相关文章推荐
想表白的茶壶  ·  Spring ...·  3 周前    · 
淡定的葡萄  ·  Day26 Spring Boot ...·  3 周前    · 
想表白的山羊  ·  php中json串仅对双引号字符进行转义,非 ...·  1 年前    · 
狂野的荔枝  ·  鸿蒙剥离 AOSP 不兼容 Android ...·  2 年前    · 
烦恼的哑铃  ·  Android通过外部浏览器调用微信H5支付 ...·  2 年前    · 
爱热闹的竹笋  ·  如何在Python中使用WSDL ...·  2 年前    · 
会搭讪的骆驼  ·  python - ...·  2 年前    · 
Code  ›  android连接指定wifi | 七夜的小屋
string config
https://nanayaharuki.github.io/2018/07/13/20180713%20android%E8%BF%9E%E6%8E%A5%E6%8C%87%E5%AE%9Awifi/
私奔的铅笔
2 年前
avatar
文章
93
标签
31
分类
3

Home
Archives
Tags
Categories
List
  • 0
  • 1
Link
About
七夜的小屋
Home
Archives
Tags
Categories
List
  • 0
  • 1
Link
About

android连接指定wifi

发表于 2018-07-13 | 更新于 2021-03-10 | Android
| 阅读量:

本文牵涉 kotlin 和 rxjava 的相关知识

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
//查询wifi信息需要申请权限,权限工具类就不要在意了,重点在下面
PermissionUtils.permission(PermissionConstants.LOCATION).callback(object : PermissionUtils.SimpleCallback {
override fun onGranted() {
//通过授权后,开启一个等待框
progressDialog.show()
// 每2秒发送一次事件
connectObs = Observable.interval(2, TimeUnit.SECONDS)
// 取30次,还没连上就结束,算这次超时
.take(30)
.subscribeOn(Schedulers.computation())
.subscribe({
//开启扫描
WifiUtils.startScan()
//连接
WifiUtils.connect(padHotspotSsid, padHotspotPwd)
}, {}, {
if (progressDialog.isShowing) progressDialog.dismiss()
ToastUtils.showShort("连接屏热点超时")
})
}

override fun onDenied() {
ToastUtils.showShort("您拒绝了请求位置权限,我们无法搜寻网络连接上屏,请在设置中打开")
}
}).request()

WifiUtils

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
object WifiUtils {
val wifiManager: WifiManager = Utils.getApp().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val connectivityManager: ConnectivityManager = Utils.getApp().applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
fun startScan() {
if (!wifiManager.isWifiEnabled) wifiManager.isWifiEnabled = true;
wifiManager.startScan()
}

fun getScanResult() = wifiManager.scanResults

fun connect(ssid: String, pwd: String): Boolean {
// 之前的写法是之前有连接的话先断连,后来发现小米华为这种一旦断连会特别积极的重连,导致指定的wifi抢不到
// 试过之后发现可以不用断,就注释掉了,直接走下面的代码进行连接
// 如果已经连上wifi了
// if(NetworkUtils.isWifiConnected()) {
//// 直接忘掉
// if(!wifiManager.removeNetwork(wifiManager.connectionInfo.networkId)) {
//// 忘不掉,至少尝试断连
// wifiManager.disconnect()
//// 断连在某些手机依然可能会失败,或者返回true其实没断掉,或者断掉了立马又被重连。。等等
// }
// }

//在扫描到的wifi中找ssid也就是wifi名相同的,如果没有说明没搜到,那么连不了,等下一次吧
val scanResult = wifiManager.scanResults.singleOrNull { it.SSID == ssid }
if (scanResult == null) {
return false
} else {
//如果找到了wifi了,从配置表中搜索该wifi的配置config,也就是以前有没有连接过
var success = false
//注意configuredNetworks中的ssid,系统源码中加上了双引号,这里比对的时候要去掉
val config = wifiManager.configuredNetworks.singleOrNull { it.SSID.replace("\"", "") == ssid }
if (config != null) {
//如果找到了,那么直接连接,不要调用wifiManager.addNetwork 这个方法会更改config的!
// val netId = wifiManager.addNetwork(config)
success = wifiManager. enableNetwork(config.networkId,true)
} else {
// 没找到的话,就创建一个新的配置,然后正常的addNetWork、enableNetwork即可
val padWifiNetwork = createWifiConfig(scanResult.SSID, pwd, getCipherType(scanResult.capabilities))
val netId = wifiManager.addNetwork(padWifiNetwork)
success = wifiManager. enableNetwork(netId,true)
}
LogUtils.d("连接${scanResult.SSID}...$success")
return success
}
}

fun isConnected(ssid: String): Boolean {
return if (wifiManager.isWifiEnabled) {
wifiManager.connectionInfo.ssid.replace("\"", "") == ssid
} else {
false
}
}

private fun createWifiConfig(ssid: String, password: String, type: WifiCapability): WifiConfiguration {
//初始化WifiConfiguration
val config = WifiConfiguration()
config.allowedAuthAlgorithms.clear()
config.allowedGroupCiphers.clear()
config.allowedKeyManagement.clear()
config.allowedPairwiseCiphers.clear()
config.allowedProtocols.clear()

//指定对应的SSID
config.SSID = "\"" + ssid + "\""

//如果之前有类似的配置
val tempConfig = wifiManager.configuredNetworks.singleOrNull { it.SSID == "\"$ssid\"" }
if (tempConfig != null) {
//则清除旧有配置 不是自己创建的network 这里其实是删不掉的
wifiManager.removeNetwork(tempConfig.networkId)
wifiManager.saveConfiguration()
}

//不需要密码的场景
if (type == WifiCapability.WIFI_CIPHER_NO_PASS) {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
//以WEP加密的场景
} else if (type == WifiCapability.WIFI_CIPHER_WEP) {
config.hiddenSSID = true
config.wepKeys[0] = "\"" + password + "\""
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN)
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED)
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
config.wepTxKeyIndex = 0
//以WPA加密的场景,自己测试时,发现热点以WPA2建立时,同样可以用这种配置连接
} else if (type == WifiCapability.WIFI_CIPHER_WPA) {
config.preSharedKey = "\"" + password + "\""
config.hiddenSSID = true
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN)
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP)
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK)
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP)
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP)
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP)
config.status = WifiConfiguration.Status.ENABLED
}

return config
}

fun getCipherType(capabilities: String): WifiCapability {
return if (capabilities.contains("WEB")) {
WifiCapability.WIFI_CIPHER_WEP
} else if (capabilities.contains("PSK")) {
WifiCapability.WIFI_CIPHER_WPA
} else if (capabilities.contains("WPS")) {
WifiCapability.WIFI_CIPHER_NO_PASS
} else {
WifiCapability.WIFI_CIPHER_NO_PASS
}
}

fun getDhcpInfo(): String {
val dhcpInfo = wifiManager.dhcpInfo
return intIP2StringIP(dhcpInfo.serverAddress)

}

fun intIP2StringIP(ip: Int): String {
return (ip and 0xFF).toString() + "." +
(ip shr 8 and 0xFF) + "." +
(ip shr 16 and 0xFF) + "." +
(ip shr 24 and 0xFF)
}
}

enum class WifiCapability {
WIFI_CIPHER_WEP, WIFI_CIPHER_WPA, WIFI_CIPHER_NO_PASS
}
}
文章作者: Nanaya Haruki
文章链接: https://nanayaharuki.github.io/2018/07/13/20180713%20android%E8%BF%9E%E6%8E%A5%E6%8C%87%E5%AE%9Awifi/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 七夜的小屋 !
Android wifi
cover of previous post
上一篇
JSONObject(map)的坑
cover of next post
下一篇
databinding 双向绑定在EditText上的一些问题
相关推荐
cover
2016-12-05
一个方便做轮播图的工具
cover
2016-12-06
滑动回弹与内层listview的滑动冲突
cover
2017-06-27
AlertDialog不显示文字
cover
2017-07-05
打开相册失败no activity found
cover
2017-07-14
给软键盘加上一个插件布局
cover
2017-07-18
gravity=center_vertical与centerVertcal=true的区别
avatar
Nanaya Haruki
文章
93
标签
31
分类
3
Follow Me
公告
This is my Blog
最新文章
AndroiStudio Java or Kotlin library 打包
AndroiStudio Java or Kotlin library 打包 2021-06-30
卢麒元
卢麒元 2021-06-24
AS的一些设置
AS的一些设置 2021-05-31
20210310 flutter web 页面空白 canvaskit
20210310 flutter web 页面空白 canvaskit 2021-03-10
绘制文字的对齐与跳过图片
绘制文字的对齐与跳过图片 2020-09-11
©2020 - 2021 By Nanaya Haruki
框架 Hexo | 主题 Butterfly
 
推荐文章
想表白的茶壶  ·  Spring WebSocket中关于WebSocket配置类的注意事项 - 一念错·误终生
3 周前
淡定的葡萄  ·  Day26 Spring Boot WebSocket 製作一個簡單的聊天室(上) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
3 周前
想表白的山羊  ·  php中json串仅对双引号字符进行转义,非双引号字符不转义方法-腾讯云开发者社区-腾讯云
1 年前
狂野的荔枝  ·  鸿蒙剥离 AOSP 不兼容 Android 热门问题汇总,不吹不黑不吵 - 知乎
2 年前
烦恼的哑铃  ·  Android通过外部浏览器调用微信H5支付,Android+PHP详解 - 掘金
2 年前
爱热闹的竹笋  ·  如何在Python中使用WSDL (SOAP) web服务? - 问答 - 腾讯云开发者社区-腾讯云
2 年前
会搭讪的骆驼  ·  python - google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials - Stack Overflow
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号