index.uts 21 KB

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