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.pswp.cn/news/451515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451515.shtml
英文地址,請注明出處:http://en.pswp.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中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的…