android 连接指定wifi

本文牵涉kotlinrxjava的相关知识

//查询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

object WifiUtils {val wifiManager: WifiManager = Utils.getApp().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManagerval connectivityManager: ConnectivityManager = Utils.getApp().applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerfun startScan() {if (!wifiManager.isWifiEnabled) wifiManager.isWifiEnabled = true;wifiManager.startScan()}fun getScanResult() = wifiManager.scanResultsfun 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 {//初始化WifiConfigurationval config = WifiConfiguration()config.allowedAuthAlgorithms.clear()config.allowedGroupCiphers.clear()config.allowedKeyManagement.clear()config.allowedPairwiseCiphers.clear()config.allowedProtocols.clear()//指定对应的SSIDconfig.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 = trueconfig.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 = trueconfig.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.dhcpInforeturn 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
}
}
复制代码

转载于:https://juejin.im/post/5b18c3d1f265da6e3c6b93da

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英特尔预计5年内将成智能手机芯片大厂

北京时间4月26日早间消息,英特尔预计,英特尔在未来5年内将成为智能手机芯片市场的“重要参与者”。过去10年中,英特尔在这一市场的多次尝试都未能获得成功。 英特尔CFO斯泰西史密斯(Stacy Smith)表示:“英特尔并不满足于成为市场中…

java.util.UnknownFormatConversionException: Conversion = ‘,‘ 解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 报错&#xff1a; 2. 原因&#xff1a; 出错代码&#xff1a; if(info.getRiceCount() < 0){ ... } 事实上 对象的riceCoun属性值…

JAVA中获取当前系统时间

一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat;public class NowString { public static void main(String[] args) { SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式Sys…

爬虫中的关于字符串的一些理解

1.基本概念 字符(Character)是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等 字符集(Character set)是多个字符的集合 字符集包括&#xff1a;ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等 ASCII编码是1个字节&#xff0c;而Uni…

分布式数据一致性

分布式系统数据一致性问题 感谢作者分享&#xff01;

HttpServletRequest中获取IP值

获取IP值&#xff1a; public class IpAdrressUtil {/*** 获取Ip地址* param request* return*/private static String getIpAdrress(HttpServletRequest request) {String Xip request.getHeader("X-Real-IP");String XFor request.getHeader("X-Forwarded-F…

国外较好的IT网站

最近有些读者给我来信说很喜欢这个网站上的文章&#xff0c;并且也想通过翻译学习英文&#xff0c;他们询问我这些文章的英文原文是从哪里找到的? 外刊IT评论上的翻译的英文来源很杂&#xff0c;我总结了一下&#xff0c;大概有几个 集中的出处&#xff0c;下面列举出来供大家…

oracle怎样把查询的null转换为0

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 NVL(Expr1,Expr2)如果Expr1为NULL&#xff0c;返回Expr2的值&#xff0c;否则返回Expr1的值 例如&#xff1a;select NVL(SUM(MONEY) ,0…

Map转为String

Map转为String 最近在做redis缓存时&#xff0c;需要将一个Map<String,Object>的对象转换为String对象存入redis&#xff0c;用的时候需从redis中取出来后并转为Map<String,Objcet>对象。 之前的做法直接就是Map对象的toString()存入redis,后面取出是就是用再转换为…

PowerBI分析Exchange服务器IIS运行日志

只要是基于Windows Server 的IIS来提供Web服务的应用&#xff0c;其实都可以对IIS的日志W3C进行分析&#xff0c;这样可以快速的了解整个web站点的运行情况&#xff0c;特别是对一些请求页面响应时间有要要求的&#xff0c;都可以从这些日志中分析问题出在哪&#xff0c;下面我…

创建自已的sql函数

# 随机产生字符串 #rand_string(n INT) rand_string 是函数名 (n INT) //该函数接收一个整数create function rand_string(n INT) returns varchar(255) #该函数会返回一个字符串begin #chars_str定义一个变量 chars_str,类型是 varchar(100),默认值abcdefghijklmnopqrstuvwxyz…

优秀博客汇总

分布式事务产生场景 一文搞定分布式系统数据一致性问题 分布式缓存的基本原理 分布式相关汇总 分布式事务&#xff0c;两阶段提交协议&#xff0c;三阶段提交协议 三星索引 TCP如何保持长连接&#xff0c;并识别不通请求&#xff1f; redisson中的看门狗机制总结 二叉树…

.NET Framework各版本比较

导读&#xff1a;一直以来&#xff0c;众多学校教学以及公司开发环境所使用Visual Studio .NET Framework版本多不相同&#xff0c;本文作者比较了.NET Framework多个版本之间的区别&#xff0c;方便各位选择和切换.NET Framework。 版本号 发布日期 Visual Studio的版本 Windo…

java中 4 种取整函数

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如下&#xff1a; round 函数可以特别注意一下&#xff1a;

python中的.idea文件夹是干嘛的

pycharm作为IDE时&#xff0c;会自动生成.idea文件夹用。 来存放项目的配置信息。这个文件夹是自动生成&#xff0c;版本控制信息等&#xff0c;包括历史记录。

section8

本章节的目的是 【明确目标用户群】 &#xff0c;以更好的服务现有用户。 【知识点】 1.作图 显示中文plt.rcParams[font.sans-serif] [SimHei] # 步骤一&#xff08;替换sans-serif字体&#xff09; plt.rcParams[axes.unicode_minus] False # 步骤二&#xff08;解决坐标轴…

经典算法汇总

一. 数组相关 二. 链表相关 三. 字符串相关 LeetCode第3题&#xff1a;无重复字符的最长子串 LeetCode第567题&#xff1a;字符串的排列 四. 二叉树相关

码农如何实现高帅富

当今IT界真可谓是好不热闹&#xff1a;谷歌推出chrome os&#xff0c;微软推出windows 8&#xff0c;W3C的HTML5也让人如雷贯耳&#xff0c;又有“云”飘在天上&#xff0c;至于最近最火的移动开发诸如ios、iphone、windows phone更是无人不知&#xff0c;无人不晓了&#xff0…

jQuery的name选择器 模糊匹配

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 $("div[id]") 选择所有含有id属性的div元素 $("input[nameeinsdan]") 选择所有的name属性等于einsdan的input元素 $…

2018.8.26 Spring自学如门

什么是Spring&#xff1f; Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的…