index.uts 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. import Context from "android.content.Context";
  2. import { UTSAndroid } from "io.dcloud.uts";
  3. import WifiManager from "android.net.wifi.WifiManager";
  4. import WifiInfo from "android.net.wifi.WifiInfo";
  5. import Manifest from "android.Manifest";
  6. import PackageManager from "android.content.pm.PackageManager";
  7. import ScanResult from "android.net.wifi.ScanResult";
  8. import BroadcastReceiver from "android.content.BroadcastReceiver";
  9. import ActivityCompat from "androidx.core.app.ActivityCompat";
  10. import IntentFilter from "android.content.IntentFilter";
  11. import JSONObject from "com.alibaba.fastjson.JSONObject";
  12. import Intent from "android.content.Intent";
  13. import Thread from "java.lang.Thread";
  14. import WifiConfiguration from 'android.net.wifi.WifiConfiguration';
  15. import AuthAlgorithm from 'android.net.wifi.WifiConfiguration.AuthAlgorithm';
  16. import KeyMgmt from 'android.net.wifi.WifiConfiguration.KeyMgmt';
  17. import TextUtils from 'android.text.TextUtils';
  18. import Build from 'android.os.Build';
  19. import { UniWifiResult, GetConnectedWifiOptions, WifiConnectOption, WifiOption, UniWifiInfo } from "../interface.uts"
  20. /**
  21. * 全局数据储存
  22. */
  23. class Global {
  24. static mReceiver : CustomBroadcastReceiver | null = null;
  25. static WIFI_AUTH_OPEN : string = "";
  26. static WIFI_AUTH_ROAM : String = "[ESS]";
  27. // 扫描wifi结果
  28. static scanList : AndroidUniWifiInfo[] = []
  29. // 获取wifi列表监听
  30. static onGetWifiListCallback : UTSCallback | null = null
  31. static supendGetWifiSuccess : ((res: UniWifiResult) => void) | null = null
  32. static supendGetWifiComplete : ((res: UniWifiResult) => void) | null = null
  33. // wifi链接监听
  34. static onWifiConnectCallbackList : UTSCallback[] = []
  35. static onWifiConnectWithPartialInfoCallbackList : UTSCallback[] = []
  36. }
  37. /**
  38. * 是否是标准的16进制字符
  39. */
  40. function isHex(key : string) : boolean {
  41. for (var i = key.length - 1; i >= 0; i--) {
  42. let c = key.charAt(i);
  43. if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a'
  44. && c <= 'f')) {
  45. return false;
  46. }
  47. }
  48. return true;
  49. }
  50. /**
  51. * 判断是否是wep格式的key
  52. */
  53. function isHexWepKey(wepKey : string) : boolean {
  54. let len = wepKey.length;
  55. // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)
  56. if (len != 10 && len != 26 && len != 58) {
  57. return false;
  58. }
  59. return isHex(wepKey);
  60. }
  61. /**
  62. * android 平台特有的Wifi信息对象,主要是加了加密信息这个字段
  63. */
  64. export type AndroidUniWifiInfo = {
  65. SSID : string;
  66. BSSID ?: string;
  67. secure : boolean;
  68. signalStrength : number;
  69. frequency : number;
  70. securityType : string;
  71. }
  72. function wrapUniWifiInfoFromAndroid(androidInfo : AndroidUniWifiInfo) : UniWifiInfo {
  73. let ret : UniWifiInfo = {
  74. SSID: androidInfo.SSID,
  75. BSSID: androidInfo.BSSID,
  76. secure: androidInfo.secure,
  77. signalStrength: androidInfo.signalStrength,
  78. frequency: androidInfo.frequency,
  79. }
  80. return ret
  81. }
  82. /**
  83. * 从扫描结果中提取统一的wifi数据结构
  84. */
  85. function wrapUniWifiInfoFromScan(scanResult : ScanResult) : AndroidUniWifiInfo {
  86. let ret : AndroidUniWifiInfo = {
  87. SSID: "",
  88. secure: false,
  89. signalStrength: 0,
  90. frequency: 0,
  91. securityType: "NONE"
  92. }
  93. if (scanResult != null) {
  94. // 如果是通过扫描列表得到的数据,进行封装
  95. ret.BSSID = scanResult.BSSID;
  96. ret.SSID = scanResult.SSID;
  97. ret.signalStrength = scanResult.level;
  98. ret.frequency = scanResult.frequency;
  99. // 是否安全,微信的标准是是否需要密码。 来源:https://developers.weixin.qq.com/community/develop/doc/00064cf1790458db19cddf9925ac00?highLine=WifiInfo
  100. ret.secure = false;
  101. let capabilities = scanResult.capabilities.trim();
  102. if ((capabilities.equals(Global.WIFI_AUTH_OPEN) || capabilities.equals(Global.WIFI_AUTH_ROAM))) {
  103. ret.secure = false;
  104. } else {
  105. ret.secure = true;
  106. }
  107. /*扩展字段*/
  108. ret.securityType = getSecurityType(scanResult);
  109. }
  110. return ret
  111. }
  112. /**
  113. * 从链接信息中提取统一的wifi数据结构
  114. */
  115. function wrapUniWifiInfoFromConnectInfo(connectInfo : WifiInfo) : UniWifiInfo {
  116. let ret : UniWifiInfo = {
  117. SSID: "",
  118. secure: false,
  119. signalStrength: 0,
  120. frequency: 0,
  121. }
  122. if (connectInfo.getSSID() != null) {
  123. let s = connectInfo.getSSID();
  124. // 微信不带,这里需要去掉引号
  125. if (s.length > 2 && s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') {
  126. s = s.substring(1, s.length - 1);
  127. }
  128. ret.SSID = s;
  129. }
  130. ret.BSSID = connectInfo.getBSSID();
  131. //Android返回的值是-100~0,而微信API规范是0~100,值越大信号越好,需要+100拉齐
  132. ret.signalStrength = connectInfo.getRssi() + 100;
  133. ret.frequency = connectInfo.getFrequency();
  134. return ret
  135. }
  136. /**
  137. * 连接wifi时使用,根据用户输入内容包装为系统需要的wifi配置对象
  138. **/
  139. @Suppress("DEPRECATION")
  140. function wrapWifiConfiguration(SSID : string, password ?: string, passwordType : string) : WifiConfiguration {
  141. let config = new WifiConfiguration();
  142. config.status = WifiConfiguration.Status.ENABLED;
  143. config.allowedAuthAlgorithms.clear();
  144. config.allowedGroupCiphers.clear();
  145. config.allowedKeyManagement.clear();
  146. config.allowedPairwiseCiphers.clear();
  147. config.allowedProtocols.clear();
  148. config.SSID = "\"".concat(SSID).concat("\"");
  149. // nopass
  150. if ("NONE".equals(passwordType) || password == null) {
  151. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
  152. }
  153. // wep
  154. else if ("WEP".equals(passwordType)) {
  155. if (password != null && !TextUtils.isEmpty(password)) {
  156. if (isHexWepKey(password)) {
  157. config.wepKeys[0] = password;
  158. } else {
  159. config.wepKeys[0] = "\"".concat(password).concat("\"");
  160. }
  161. }
  162. config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
  163. config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
  164. config.allowedKeyManagement.set(KeyMgmt.NONE);
  165. config.wepTxKeyIndex = 0;
  166. }
  167. // wpa
  168. else if ("WPA".equals(passwordType)) {
  169. config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
  170. config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
  171. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
  172. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
  173. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
  174. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
  175. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
  176. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
  177. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
  178. config.preSharedKey = "\"".concat(password).concat("\"");
  179. }
  180. return config;
  181. }
  182. /**
  183. * 判断当前wifi的加密类型
  184. */
  185. function getSecurityType(result : ScanResult) : string {
  186. if (result.capabilities.contains("WEP")) {
  187. return "WEP";
  188. } else if (result.capabilities.contains("PSK")) {
  189. return "WPA";
  190. } else if (result.capabilities.contains("EAP")) {
  191. return "EAP";
  192. }
  193. return "NONE";
  194. }
  195. function zeroCountNum(source ?: string) : number {
  196. if (source == null) {
  197. return 0
  198. }
  199. var splitted = source.split(":")
  200. var countNum = 0;
  201. for (perItem in splitted) {
  202. if (perItem == "00") {
  203. countNum += 1
  204. }
  205. }
  206. return countNum
  207. }
  208. /**
  209. * 自定义wifi变化广播监听器
  210. */
  211. @Suppress("UNUSED_PARAMETER", "DEPRECATION")
  212. class CustomBroadcastReceiver extends BroadcastReceiver {
  213. mWifiManager : WifiManager | null = null;
  214. constructor(wifiManager : WifiManager) {
  215. super();
  216. this.mWifiManager = wifiManager;
  217. }
  218. override onReceive(_context : Context, intent : Intent) : void {
  219. if (intent.action == WifiManager.WIFI_STATE_CHANGED_ACTION) {
  220. let state =
  221. intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)
  222. if (state == WifiManager.WIFI_STATE_ENABLED) {
  223. // 获取当前的connectInfo 并且进行数据封装
  224. // let uniWifiInfo = new UniWifiInfo(null)
  225. let uniWifiInfo : UniWifiInfo = {
  226. SSID: "",
  227. secure: false,
  228. signalStrength: 0,
  229. frequency: 0,
  230. }
  231. //做一些异步操作
  232. setTimeout(function () {
  233. // BroadcastReceiver 中不能执行耗时任务,需要使用setTimeout
  234. // @ts-ignore
  235. let winfo = this.mWifiManager!.getConnectionInfo();
  236. while (winfo.bssid == null || zeroCountNum(winfo.bssid) > 4) {
  237. Thread.sleep(1000)
  238. winfo = this.mWifiManager!.getConnectionInfo();
  239. }
  240. // 封装成数据对象
  241. uniWifiInfo = wrapUniWifiInfoFromConnectInfo(winfo)
  242. let res = {
  243. errMsg: 'onWifiConnected:ok',
  244. errCode: 0,
  245. wifi: uniWifiInfo
  246. }
  247. // wifi状态可用了,分发当前的链接状态给已注册的监听集合
  248. for (let perCallback in Global.onWifiConnectCallbackList) {
  249. perCallback(res);
  250. }
  251. // 封装仅SSID 数据对象
  252. var connectedWithPartialInfo = {
  253. SSID: uniWifiInfo.SSID
  254. }
  255. for (let perCallback in Global.onWifiConnectWithPartialInfoCallbackList) {
  256. perCallback(connectedWithPartialInfo);
  257. }
  258. }, 100);
  259. }
  260. }
  261. if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
  262. startWifiScaning = false;
  263. // wifi 扫描结果回调
  264. let results = this.mWifiManager!.scanResults;
  265. if (results != null) {
  266. Global.scanList = []
  267. for (let scanResult in results) {
  268. if (scanResult.SSID == null) {
  269. continue;
  270. }
  271. Global.scanList.push(wrapUniWifiInfoFromScan(scanResult));
  272. }
  273. // 挨个通知,所有的监听器
  274. if(Global.onGetWifiListCallback != null){
  275. const data = new JSONObject();
  276. data["wifiList"] = Global.scanList
  277. Global.onGetWifiListCallback?.(data);
  278. /**
  279. * 确保onGetWifiList 只会被执行一次
  280. */
  281. Global.onGetWifiListCallback = null
  282. }
  283. }
  284. let ret : UniWifiResult = {
  285. errCode: 0,
  286. errSubject: "uni-getWifiList",
  287. errMsg: "getWifiList:ok"
  288. }
  289. if(Global.supendGetWifiSuccess != null){
  290. Global.supendGetWifiSuccess?.(ret)
  291. Global.supendGetWifiSuccess = null
  292. }
  293. if(Global.supendGetWifiComplete != null){
  294. Global.supendGetWifiComplete?.(ret)
  295. Global.supendGetWifiComplete = null
  296. }
  297. }
  298. }
  299. }
  300. /************************* 下面是对外提供的函数 *************************/
  301. /**
  302. * start wifi是否正在扫描
  303. */
  304. var startWifiScaning = false
  305. /**
  306. * 开启wifi
  307. */
  308. @Suppress("DEPRECATION")
  309. export function startWifi(option : WifiOption) {
  310. // 需要先开启wifi,才能使用后续的功能
  311. let requestCode = 1001;
  312. let permissionWifi = arrayOf("android.permission.ACCESS_FINE_LOCATION");
  313. let result : UniWifiResult = {
  314. errCode: 12001,
  315. errMsg: "startWifi:premission loss",
  316. errSubject: "uni-startWifi"
  317. }
  318. // 检查权限
  319. if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  320. ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, permissionWifi, requestCode.toInt())
  321. // 尚不具备权限,返回错误
  322. let err = new UniError("uni-startWifi",12001,"startWifi:premission loss");
  323. option.fail?.(err)
  324. option.complete?.(err)
  325. return;
  326. }
  327. // 具备了权限,继续前进
  328. let wifiManager : WifiManager =
  329. UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
  330. // 用户没有开启wifi 总开关
  331. if (!wifiManager.isWifiEnabled()) {
  332. // wifi 没开启
  333. let err = new UniError("uni-startWifi",12005,"wifi not turned on");
  334. option.fail?.(err);
  335. option.complete?.(err);
  336. return;
  337. }
  338. // 初始化wifi 状态广播监听,后续所有的api,均基于此
  339. if(Global.mReceiver != null){
  340. // 说明已经注册过了
  341. result.errCode = 0
  342. result.errMsg = "startWifi:ok"
  343. option.success?.(result)
  344. option.complete?.(result)
  345. return
  346. }
  347. Global.mReceiver = new CustomBroadcastReceiver(wifiManager)
  348. let filter = new IntentFilter()
  349. filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
  350. // @ts-ignore
  351. filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
  352. // @ts-ignore
  353. filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
  354. UTSAndroid.getUniActivity()!.registerReceiver(Global.mReceiver, filter)
  355. /**
  356. * activity 被销毁时,取消注册
  357. */
  358. UTSAndroid.onAppActivityDestroy(function () {
  359. if (Global.mReceiver != null) {
  360. UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver)
  361. Global.mReceiver = null
  362. Global.scanList = []
  363. Global.onGetWifiListCallback = null
  364. Global.onWifiConnectCallbackList = []
  365. Global.onWifiConnectWithPartialInfoCallbackList = []
  366. }
  367. });
  368. startWifiScaning = true
  369. // 开始扫描
  370. wifiManager.startScan()
  371. result.errCode = 0
  372. result.errMsg = "startWifi:ok"
  373. option.success?.(result)
  374. option.complete?.(result)
  375. }
  376. /**
  377. * 获取wifi列表
  378. */
  379. @Suppress("DEPRECATION")
  380. export function getWifiList(option : WifiOption) {
  381. if (Global.mReceiver == null) {
  382. // 还没调用startWifi 提示报错
  383. let err = new UniError("uni-getWifiList",12000,"getWifiList:fail:not invoke startWifi");
  384. option.fail?.(err)
  385. option.complete?.(err)
  386. return
  387. }
  388. let wifiManager : WifiManager =
  389. UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
  390. Global.supendGetWifiSuccess = option.success
  391. Global.supendGetWifiComplete = option.complete
  392. wifiManager.startScan()
  393. }
  394. /**
  395. * wifi 链接成功的回调注册
  396. */
  397. export function onWifiConnected(callback : UTSCallback) {
  398. Global.onWifiConnectCallbackList.push(callback)
  399. }
  400. export function onWifiConnectedWithPartialInfo(callback : UTSCallback) {
  401. Global.onWifiConnectWithPartialInfoCallbackList.push(callback)
  402. }
  403. /**
  404. * wifi 链接成功的回调取消注册
  405. */
  406. export function offWifiConnected(callback? : UTSCallback) {
  407. if(callback == null){
  408. Global.onWifiConnectCallbackList = []
  409. return
  410. }
  411. let callbackIndex = Global.onWifiConnectCallbackList.indexOf(callback)
  412. if (callbackIndex >= 0) {
  413. Global.onWifiConnectCallbackList.splice(callbackIndex, 1);
  414. }
  415. }
  416. /**
  417. * 不具备详细信息的wifi 反注册
  418. */
  419. export function offWifiConnectedWithPartialInfo(callback? : UTSCallback) {
  420. if(callback == null){
  421. Global.onWifiConnectWithPartialInfoCallbackList = []
  422. return
  423. }
  424. let callbackIndex = Global.onWifiConnectWithPartialInfoCallbackList.indexOf(callback)
  425. if (callbackIndex >= 0) {
  426. Global.onWifiConnectWithPartialInfoCallbackList.splice(callbackIndex, 1);
  427. }
  428. }
  429. /**
  430. * 注册Wifi列表的监听事件
  431. */
  432. export function onGetWifiList(callback : UTSCallback) {
  433. Global.onGetWifiListCallback = callback
  434. }
  435. /**
  436. * 取消注册Wifi列表的监听事件
  437. */
  438. export function offGetWifiList(callback? : UTSCallback) {
  439. Global.onGetWifiListCallback = null
  440. Global.supendGetWifiComplete = null
  441. Global.supendGetWifiSuccess = null
  442. }
  443. /**
  444. * 真正执行wifi链接逻辑
  445. */
  446. function realWifiConnect(option : WifiConnectOption){
  447. if (Global.mReceiver == null || Global.scanList.length < 1) {
  448. let err = new UniError("uni-connectWifi",12000,"connectWifi:fail:not invoke startWifi");
  449. option.fail?.(err)
  450. option.complete?.(err)
  451. return
  452. }
  453. // 执行后续的逻辑
  454. let scanWifiInfo : AndroidUniWifiInfo | null = null
  455. for (let scanResult in Global.scanList) {
  456. if (scanResult.SSID.equals(option.SSID)) {
  457. scanWifiInfo = scanResult
  458. }
  459. }
  460. if (scanWifiInfo == null) {
  461. // 不在扫描列表中返回错误
  462. let err = new UniError("uni-connectWifi",12000,"connectWifi:fail:not invoke startWifi");
  463. option.fail?.(err)
  464. option.complete?.(err)
  465. return
  466. }
  467. let wifiConfigration = wrapWifiConfiguration(scanWifiInfo.SSID, option.password, scanWifiInfo.securityType);
  468. wifiConfigration.BSSID = scanWifiInfo.BSSID
  469. let wifiManager : WifiManager =
  470. UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
  471. // 如果已经存在了指定wifi 配置,移除之
  472. let targetExistConfig : WifiConfiguration | null = null
  473. let existingConfigs = wifiManager.getConfiguredNetworks();
  474. for (let existingConfig in existingConfigs) {
  475. if (existingConfig.SSID.equals("\"" + option.SSID + "\"")) {
  476. targetExistConfig = existingConfig
  477. }
  478. }
  479. // 如果wifi已经保存了当前ssid的配置,可能是别的应用添加的。android系统要求,需要删除掉重新添加
  480. if (targetExistConfig != null) {
  481. let removeRet = wifiManager.removeNetwork(targetExistConfig.networkId);
  482. if (!removeRet) {
  483. // add since 2023-03-28,如果当前系统大于等于android10, 则明确当前系统不支持
  484. if(Build.VERSION.SDK_INT > 28){
  485. // 系统大于android 9
  486. let err = new UniError("uni-connectWifi",12001,"connectWifi:system not support");
  487. option.fail?.(err)
  488. option.complete?.(err)
  489. }else{
  490. // 移除之前的配置失败了,返回错误,需要用户手动取消保存一下
  491. let err = new UniError("uni-connectWifi",12013,"connectWifi:wifi config may be expired");
  492. option.fail?.(err)
  493. option.complete?.(err)
  494. }
  495. return
  496. }
  497. }
  498. let currentConnect = wifiManager.getConnectionInfo()
  499. if (currentConnect.networkId >= 0) {
  500. wifiManager.disableNetwork(currentConnect.networkId)
  501. } else {
  502. wifiManager.removeNetwork(currentConnect.networkId)
  503. }
  504. wifiManager.disconnect()
  505. let connected = false;
  506. try {
  507. let netID = wifiManager.addNetwork(wifiConfigration);
  508. // 如果-1 说明没添加上,报错即可
  509. if (netID < 0) {
  510. let err = new UniError("uni-connectWifi",12002,"connectWifi:password error Wi-Fi");
  511. option.fail?.(err)
  512. option.complete?.(err)
  513. return
  514. }
  515. let enabled = wifiManager.enableNetwork(netID, true);
  516. if (!enabled) {
  517. let err = new UniError("uni-connectWifi",12007,"connectWifi:user denied");
  518. option.fail?.(err)
  519. option.complete?.(err)
  520. return
  521. }
  522. connected = wifiManager.reconnect();
  523. } catch (e) {
  524. connected = false;
  525. console.log(e);
  526. }
  527. if (!connected) {
  528. // 出错了,返回错误
  529. // 兜底的报错
  530. let err = new UniError("uni-connectWifi",12010,"connectWifi:fail:unknown error");
  531. option.fail?.(err)
  532. option.complete?.(err)
  533. return
  534. }
  535. let result : UniWifiResult = {
  536. errCode: 0,
  537. errMsg: "connectWifi:ok",
  538. errSubject: "uni-connectWifi",
  539. }
  540. wifiManager.saveConfiguration()
  541. //scanWifiInfo 根据 partialInfo 填充给返回字段
  542. if (option.partialInfo != null && option.partialInfo == true) {
  543. let wifiPartialInfo : UniWifiInfo = {
  544. SSID: scanWifiInfo.SSID
  545. }
  546. result.wifi = wifiPartialInfo
  547. } else {
  548. result.wifi = wrapUniWifiInfoFromAndroid(scanWifiInfo)
  549. }
  550. option.success?.(result)
  551. option.complete?.(result)
  552. }
  553. /**
  554. * 链接指定wifi
  555. */
  556. @Suppress("UNUSED_PARAMETER", "DEPRECATION")
  557. export function connectWifi(option : WifiConnectOption) {
  558. if (option.maunal == true) {
  559. // 指定了手动模式
  560. let manunalIntent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
  561. UTSAndroid.getUniActivity()!.startActivity(manunalIntent);
  562. let result : UniWifiResult = {
  563. errCode: 0,
  564. errMsg: "connectWifi:ok",
  565. errSubject: "uni-connectWifi",
  566. }
  567. option.success?.(result)
  568. option.complete?.(result)
  569. return
  570. }
  571. // add since 2022-03-28 ,增加逻辑,如果正在扫描中,则可以等待5s
  572. if(startWifiScaning){
  573. let taskCount = 0
  574. let taskId:number = 0
  575. taskId = setInterval(function(){
  576. taskCount += 1;
  577. if(taskCount >= 5 || startWifiScaning == false){
  578. // 超过10s了。或者扫描过程结束了
  579. clearInterval(taskId)
  580. realWifiConnect(option)
  581. }
  582. },2000)
  583. UTSAndroid.onAppActivityDestroy(function () {
  584. clearInterval(taskId)
  585. });
  586. }else{
  587. realWifiConnect(option)
  588. }
  589. }
  590. /**
  591. * 关闭wifi
  592. */
  593. export function stopWifi(option : WifiOption) {
  594. // 需要先开启wifi,才能使用后续的功能
  595. if (Global.mReceiver == null) {
  596. let err = new UniError("uni-stopWifi",12000,"stopWifi:not init");
  597. option.fail?.(err)
  598. option.complete?.(err)
  599. return
  600. }
  601. try {
  602. UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver)
  603. } catch (e) {
  604. // 多次调用
  605. //TODO handle the exception
  606. }
  607. Global.onGetWifiListCallback = null
  608. Global.onWifiConnectWithPartialInfoCallbackList = []
  609. Global.onWifiConnectCallbackList = []
  610. Global.mReceiver = null
  611. let result : UniWifiResult = {
  612. errCode: 0,
  613. errSubject: "uni-stopWifi",
  614. errMsg: "stopWifi:ok"
  615. }
  616. option.success?.(result)
  617. option.complete?.(result)
  618. }
  619. /**
  620. * 获取当前连接中的wifi信息
  621. */
  622. @Suppress("DEPRECATION")
  623. export function getConnectedWifi(option : GetConnectedWifiOptions) {
  624. let wifiInfo : UniWifiInfo = {
  625. SSID: ""
  626. }
  627. if (Global.mReceiver == null) {
  628. // 还没调用startWifi 提示报错
  629. let err = new UniError("uni-getConnectedWifi",12000,"getConnectedWifi:fail:not invoke startWifi");
  630. option.fail?.(err)
  631. option.complete?.(err)
  632. return
  633. }
  634. // 需要先校验权限,没有位置权限无法获取wifi
  635. if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  636. // 尚不具备权限,返回错误
  637. let err = new UniError("uni-getConnectedWifi",12001,"getConnectedWifi:permission loss");
  638. option.fail?.(err)
  639. option.complete?.(err)
  640. return;
  641. }
  642. const context = UTSAndroid.getAppContext();
  643. if (context != null) {
  644. const wm = context.getSystemService(
  645. Context.WIFI_SERVICE
  646. ) as WifiManager;
  647. // 测试android 12上可以使用
  648. //@ts-ignore
  649. const winfo = wm.getConnectionInfo();
  650. wifiInfo = wrapUniWifiInfoFromConnectInfo(winfo);
  651. let res : UniWifiResult = {
  652. errCode: 0,
  653. errMsg: "getConnectedWifi:ok",
  654. errSubject: "uni-getConnectedWifi",
  655. }
  656. // 判断一下是否wifi 关闭了
  657. if (option.partialInfo!= null) {
  658. let ret : UniWifiInfo = {
  659. SSID: wifiInfo.SSID
  660. }
  661. res.wifi = ret;
  662. } else {
  663. if (wifiInfo.BSSID == null || zeroCountNum(wifiInfo.BSSID) > 3) {
  664. let err = new UniError("uni-getConnectedWifi",12005,"getConnectedWifi:fail:wifi is disable");
  665. option.fail?.(err)
  666. option.complete?.(err)
  667. return
  668. }
  669. res.wifi = wifiInfo;
  670. }
  671. option.success?.(res)
  672. option.complete?.(res)
  673. return
  674. }
  675. let err = new UniError("uni-getConnectedWifi",12000,"getConnectedWifi:fail:not invoke startWifi");
  676. option.fail?.(err)
  677. option.complete?.(err)
  678. }