index.uts 15.8 KB
Newer Older
1
import Context from "android.content.Context";
2
import { UTSAndroid } from "io.dcloud.uts";
3
import WifiManager from "android.net.wifi.WifiManager";
杜庆泉's avatar
杜庆泉 已提交
4
import WifiInfo from "android.net.wifi.WifiInfo";
杜庆泉's avatar
杜庆泉 已提交
5 6 7 8 9 10 11 12
import Manifest from "android.Manifest";
import PackageManager from "android.content.pm.PackageManager";
import ScanResult from "android.net.wifi.ScanResult";
import BroadcastReceiver from "android.content.BroadcastReceiver";
import ActivityCompat from "androidx.core.app.ActivityCompat";
import IntentFilter from "android.content.IntentFilter";
import JSONObject from "com.alibaba.fastjson.JSONObject";
import Intent from "android.content.Intent";
杜庆泉's avatar
杜庆泉 已提交
13
import Thread from "java.lang.Thread";
14

杜庆泉's avatar
杜庆泉 已提交
15
import WifiConfiguration from 'android.net.wifi.WifiConfiguration';
16 17 18
import AuthAlgorithm from 'android.net.wifi.WifiConfiguration.AuthAlgorithm';
import KeyMgmt from 'android.net.wifi.WifiConfiguration.KeyMgmt';
import TextUtils from 'android.text.TextUtils';
19

杜庆泉's avatar
杜庆泉 已提交
20 21 22 23 24 25 26 27 28
/**
 * Wifi 函数通用入参封装
 */
type WifiOption = {
	success?: (res: object) => void;
	fail?: (res: object) => void;
	complete?: (res: object) => void;
};

29 30


杜庆泉's avatar
杜庆泉 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43
/**
 * Wifi 链接参数封装
 */
type WifiConnectOption = {
	SSID:string;
	BSSID:string;
	password:string;
	maunal:boolean;
	partialInfo:boolean;
	success?: (res: object) => void;
	fail?: (res: object) => void;
	complete?: (res: object) => void;
}
杜庆泉's avatar
杜庆泉 已提交
44

45 46 47
/**
 * 是否是标准的16进制字符
 */
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
function isHex(key:string):boolean {
	for (var i = key.length - 1; i >= 0; i--) {
		let c = key.charAt(i);
		if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a'
				&& c <= 'f')) {
			return false;
		}
	}

	return true;
}

/**
 * 判断是否是wep格式的key
 */
function isHexWepKey(wepKey:string):boolean {
	let len = wepKey.length;

	// WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)
	if (len != 10 && len != 26 && len != 58) {
		return false;
	}

	return isHex(wepKey);
}

74
@Suppress("DEPRECATION")
75
function wrapWifiConfiguration(SSID:string ,password:string,passwordType:string):WifiConfiguration {
杜庆泉's avatar
杜庆泉 已提交
76 77 78 79 80 81 82 83 84 85
		
	let config = new WifiConfiguration();
	
	config.allowedAuthAlgorithms.clear();
	config.allowedGroupCiphers.clear();
	config.allowedKeyManagement.clear();
	config.allowedPairwiseCiphers.clear();
	config.allowedProtocols.clear();
	config.SSID = "\"" + SSID + "\"";
	
86 87 88 89 90
	
	// nopass
	if ("NONE".equals(passwordType)) {
		config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
	}
杜庆泉's avatar
杜庆泉 已提交
91
	// wep
92 93 94 95 96
	if ("WEP".equals(passwordType)) {
		if (!TextUtils.isEmpty(password)) {
			if (isHexWepKey(password)) {
				config.wepKeys[0] = password;
			} else {
杜庆泉's avatar
杜庆泉 已提交
97
				config.wepKeys[0] = "\"".concat(password).concat("\"");
98 99 100 101 102 103 104 105 106
			}
		}
		config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
		config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
		config.allowedKeyManagement.set(KeyMgmt.NONE);
		config.wepTxKeyIndex = 0;
	}
	// wpa
	if ("WPA".equals(passwordType)) {
杜庆泉's avatar
杜庆泉 已提交
107
		config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
108
		config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
杜庆泉's avatar
杜庆泉 已提交
109 110 111 112 113
		config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
		config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
		config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
		config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
		config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
114
		config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
杜庆泉's avatar
杜庆泉 已提交
115 116
		config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
		config.preSharedKey = "\"".concat(password).concat("\"");
117 118
	}
	
杜庆泉's avatar
杜庆泉 已提交
119 120
	return config;
}
杜庆泉's avatar
杜庆泉 已提交
121 122 123 124
/**
 * Wifi信息统一数据结构
 */
class UniWifiInfo {
杜庆泉's avatar
杜庆泉 已提交
125

杜庆泉's avatar
杜庆泉 已提交
126 127
	SSID: string = "";
	BSSID: string = "";
杜庆泉's avatar
杜庆泉 已提交
128 129 130
	secure: boolean = false;
	signalStrength: Number = 0;
	frequency: Number = 0;
杜庆泉's avatar
杜庆泉 已提交
131 132 133
	
	/*下面的字段属于扩展字段*/
	securityType:string = ""
杜庆泉's avatar
杜庆泉 已提交
134

135
	constructor(scanResult: ScanResult|null = null) {
杜庆泉's avatar
杜庆泉 已提交
136
		if (scanResult != null) {
杜庆泉's avatar
杜庆泉 已提交
137 138 139
			// 如果是通过扫描列表得到的数据,进行封装
			this.BSSID = scanResult.BSSID;
			this.SSID = scanResult.SSID;
杜庆泉's avatar
杜庆泉 已提交
140

杜庆泉's avatar
杜庆泉 已提交
141 142
			this.signalStrength = scanResult.level;
			this.frequency = scanResult.frequency;
杜庆泉's avatar
杜庆泉 已提交
143

杜庆泉's avatar
杜庆泉 已提交
144 145 146
			// 是否安全,微信的标准是是否需要密码。 来源:https://developers.weixin.qq.com/community/develop/doc/00064cf1790458db19cddf9925ac00?highLine=WifiInfo
			this.secure = false;
			let capabilities = scanResult.capabilities.trim();
打打卡夫卡's avatar
打打卡夫卡 已提交
147
			if ((capabilities.equals(Global.WIFI_AUTH_OPEN) || capabilities.equals(Global.WIFI_AUTH_ROAM))) {
杜庆泉's avatar
杜庆泉 已提交
148
				this.secure = false;
杜庆泉's avatar
杜庆泉 已提交
149
			} else {
杜庆泉's avatar
杜庆泉 已提交
150 151
				this.secure = true;
			}
杜庆泉's avatar
杜庆泉 已提交
152 153 154
			
			/*扩展字段*/
			this.securityType = getSecurityType(scanResult);
杜庆泉's avatar
杜庆泉 已提交
155 156
		}
	}
杜庆泉's avatar
杜庆泉 已提交
157

杜庆泉's avatar
杜庆泉 已提交
158 159 160
	/**
	 * 根据connectInfo 链接信息对wifi数据结构进行初始化
	 */
杜庆泉's avatar
杜庆泉 已提交
161
	wrapConnectInfo(connectInfo: WifiInfo): void {
杜庆泉's avatar
杜庆泉 已提交
162 163
		console.log(connectInfo.getSSID());
		console.log(connectInfo.getBSSID());
杜庆泉's avatar
杜庆泉 已提交
164 165
		if (connectInfo.getBSSID() == null) {
			return
杜庆泉's avatar
杜庆泉 已提交
166
		}
打打卡夫卡's avatar
打打卡夫卡 已提交
167 168 169 170 171
		if (connectInfo.getSSID() != null) {
			let s = connectInfo.getSSID();
			// 微信不带,这里需要去掉引号
			if (s.length > 2 && s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') {
				s = s.substring(1, s.length - 1);
杜庆泉's avatar
杜庆泉 已提交
172
			}
打打卡夫卡's avatar
打打卡夫卡 已提交
173 174
			this.SSID = s;
		}
杜庆泉's avatar
杜庆泉 已提交
175

打打卡夫卡's avatar
打打卡夫卡 已提交
176 177 178 179
		this.BSSID = connectInfo.getBSSID();
		//Android返回的值是-100~0,而微信API规范是0~100,值越大信号越好,需要+100拉齐
		this.signalStrength = connectInfo.getRssi() + 100; 
		this.frequency = connectInfo.getFrequency();
杜庆泉's avatar
杜庆泉 已提交
180

杜庆泉's avatar
杜庆泉 已提交
181
	}
杜庆泉's avatar
杜庆泉 已提交
182 183


杜庆泉's avatar
杜庆泉 已提交
184 185 186 187 188
}

/**
 * 获取当前链接的wifi信息
 */
189
type GetConnectedWifiOptions = {
杜庆泉's avatar
杜庆泉 已提交
190 191 192 193
	partialInfo?: boolean
	success?: (res: UTSJSONObject) => void
	fail?: (res: UTSJSONObject) => void
	complete?: (res: UTSJSONObject) => void
194 195
}

杜庆泉's avatar
杜庆泉 已提交
196 197 198 199 200


/**
 * 全局数据储存
 */
杜庆泉's avatar
杜庆泉 已提交
201
class Global {
杜庆泉's avatar
杜庆泉 已提交
202 203
	static mReceiver: CustomBroadcastReceiver|null = null;
	static WIFI_AUTH_OPEN: string = "";
杜庆泉's avatar
杜庆泉 已提交
204
	static WIFI_AUTH_ROAM: String = "[ESS]";
205 206
	
	static scanList: UniWifiInfo[] = []
杜庆泉's avatar
杜庆泉 已提交
207 208
	static getWifiListCallbackList: UTSCallback[] = []
	static onWifiConnectCallbackList: UTSCallback[] = []
杜庆泉's avatar
杜庆泉 已提交
209 210 211
}


杜庆泉's avatar
杜庆泉 已提交
212 213 214 215 216 217 218 219 220 221 222 223
function getSecurityType(result:ScanResult):string {
    if (result.capabilities.contains("WEP")) {
        return "WEP";
    } else if (result.capabilities.contains("PSK")) {
        return "WPA";
    } else if (result.capabilities.contains("EAP")) {
        return "EAP";
    }
    return "NONE";
}


杜庆泉's avatar
杜庆泉 已提交
224 225 226
/**
 * 自定义wifi变化广播监听器
 */
227
@Suppress("UNUSED_PARAMETER","DEPRECATION")
杜庆泉's avatar
杜庆泉 已提交
228
class CustomBroadcastReceiver extends BroadcastReceiver {
杜庆泉's avatar
杜庆泉 已提交
229

杜庆泉's avatar
杜庆泉 已提交
230
	mWifiManager: WifiManager|null = null;
杜庆泉's avatar
杜庆泉 已提交
231 232

	constructor(wifiManager: WifiManager) {
杜庆泉's avatar
杜庆泉 已提交
233 234 235
		super();
		this.mWifiManager = wifiManager;
	}
杜庆泉's avatar
杜庆泉 已提交
236 237 238 239

	override onReceive(_context: Context, intent: Intent): void {


杜庆泉's avatar
杜庆泉 已提交
240 241 242 243 244 245
		if (intent.action == WifiManager.WIFI_STATE_CHANGED_ACTION) {
			let state =
				intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)
			if (state == WifiManager.WIFI_STATE_ENABLED) {
				// 获取当前的connectInfo 并且进行数据封装
				let uniWifiInfo = new UniWifiInfo(null)
杜庆泉's avatar
杜庆泉 已提交
246 247 248 249
				//做一些异步操作
				setTimeout(function() {
					// BroadcastReceiver 中不能执行耗时任务,需要使用setTimeout
					console.log(Thread.currentThread().getName())
打打卡夫卡's avatar
打打卡夫卡 已提交
250
					// @ts-ignore
杜庆泉's avatar
杜庆泉 已提交
251 252 253
					let winfo = this.mWifiManager!.getConnectionInfo();
					while (winfo.bssid == null) {
						Thread.sleep(1000)
打打卡夫卡's avatar
打打卡夫卡 已提交
254
						winfo = this.mWifiManager!.getConnectionInfo();
杜庆泉's avatar
杜庆泉 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
					}

					// 封装成数据对象
					uniWifiInfo.wrapConnectInfo(winfo)
					let res = {
						errMsg: 'onWifiConnected:ok',
						errCode: 0,
						wifi: uniWifiInfo
					}
					// wifi状态可用了,分发当前的链接状态给已注册的监听集合
					for (let perCallback in Global.onWifiConnectCallbackList) {
						perCallback(res);
					}

				}, 100);
			}

杜庆泉's avatar
杜庆泉 已提交
272
		}
杜庆泉's avatar
杜庆泉 已提交
273 274


杜庆泉's avatar
杜庆泉 已提交
275
		if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
杜庆泉's avatar
杜庆泉 已提交
276 277
			// wifi 扫描结果回调
			let results = this.mWifiManager!.scanResults;
杜庆泉's avatar
杜庆泉 已提交
278

杜庆泉's avatar
杜庆泉 已提交
279 280
			if (results != null) {
				Global.scanList = []
杜庆泉's avatar
杜庆泉 已提交
281 282 283
				for (let scanResult in results) {
					if (scanResult.SSID == null) {
						continue;
杜庆泉's avatar
杜庆泉 已提交
284
					}
杜庆泉's avatar
杜庆泉 已提交
285
					Global.scanList.push(new UniWifiInfo(scanResult));
杜庆泉's avatar
杜庆泉 已提交
286
				}
杜庆泉's avatar
杜庆泉 已提交
287

杜庆泉's avatar
杜庆泉 已提交
288
				// 挨个通知,所有的监听器
杜庆泉's avatar
杜庆泉 已提交
289 290
				for (let perCallback in Global.getWifiListCallbackList) {

杜庆泉's avatar
杜庆泉 已提交
291
					const data = new JSONObject();
杜庆泉's avatar
杜庆泉 已提交
292 293
					// let mainJsonStr = Gson().toJson(Global.scanList);
					data["wifiList"] = Global.scanList
杜庆泉's avatar
杜庆泉 已提交
294 295
					perCallback(data);
				}
杜庆泉's avatar
杜庆泉 已提交
296

杜庆泉's avatar
杜庆泉 已提交
297
			}
杜庆泉's avatar
杜庆泉 已提交
298

杜庆泉's avatar
杜庆泉 已提交
299 300
		}
	}
杜庆泉's avatar
杜庆泉 已提交
301

杜庆泉's avatar
杜庆泉 已提交
302 303
}

304 305


杜庆泉's avatar
杜庆泉 已提交
306 307 308 309 310
/************************* 下面是对外提供的函数 *************************/

/**
 * 获取wifi列表
 */
311
@Suppress("DEPRECATION")
杜庆泉's avatar
杜庆泉 已提交
312
export function getWifiList(option: WifiOption) {
313 314 315 316 317
	
	if (Global.mReceiver == null) {
		// 还没调用startWifi 提示报错
		var result = {
			errCode: 12000,
杜庆泉's avatar
杜庆泉 已提交
318
			errMsg: "getWifiList:fail:not invoke startWifi",
杜庆泉's avatar
杜庆泉 已提交
319
			errSubject:"uni-getWifiList"
320 321 322 323 324 325 326
		}
		option.fail?.(result)
		option.complete?.(result)
	
		return
	}
	
杜庆泉's avatar
杜庆泉 已提交
327
	let wifiManager: WifiManager =
328
		UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
杜庆泉's avatar
杜庆泉 已提交
329 330
	wifiManager.startScan()

杜庆泉's avatar
杜庆泉 已提交
331
	let ret = {
杜庆泉's avatar
杜庆泉 已提交
332 333
		errCode: 0,
		errMsg: "getWifiList:ok"
杜庆泉's avatar
杜庆泉 已提交
334
	}
打打卡夫卡's avatar
打打卡夫卡 已提交
335 336
	option.success?.(ret)
	option.complete?.(ret)
杜庆泉's avatar
杜庆泉 已提交
337

杜庆泉's avatar
杜庆泉 已提交
338 339 340
}


杜庆泉's avatar
杜庆泉 已提交
341

杜庆泉's avatar
杜庆泉 已提交
342 343 344
/**
 * wifi 链接成功的回调注册
 */
杜庆泉's avatar
杜庆泉 已提交
345
export function onWifiConnected(callback: UTSCallback) {
杜庆泉's avatar
杜庆泉 已提交
346 347 348 349 350 351
	Global.onWifiConnectCallbackList.push(callback)
}

/**
 * wifi 链接成功的回调取消注册
 */
杜庆泉's avatar
杜庆泉 已提交
352
export function offWifiConnected(callback: UTSCallback) {
杜庆泉's avatar
杜庆泉 已提交
353
	let callbackIndex = Global.onWifiConnectCallbackList.indexOf(callback)
杜庆泉's avatar
杜庆泉 已提交
354 355
	if (callbackIndex > 0) {
		Global.onWifiConnectCallbackList.splice(callbackIndex, 1);
杜庆泉's avatar
杜庆泉 已提交
356 357 358
	}
}

杜庆泉's avatar
杜庆泉 已提交
359 360 361
/**
 * 注册Wifi列表的监听事件
 */
杜庆泉's avatar
杜庆泉 已提交
362
export function onGetWifiList(callback: UTSCallback) {
杜庆泉's avatar
杜庆泉 已提交
363 364 365 366 367
	Global.getWifiListCallbackList.push(callback)
}
/**
 * 取消注册Wifi列表的监听事件
 */
杜庆泉's avatar
杜庆泉 已提交
368
export function offGetWifiList(callback: UTSCallback) {
杜庆泉's avatar
杜庆泉 已提交
369
	let callbackIndex = Global.getWifiListCallbackList.indexOf(callback)
杜庆泉's avatar
杜庆泉 已提交
370 371
	if (callbackIndex > 0) {
		Global.getWifiListCallbackList.splice(callbackIndex, 1);
杜庆泉's avatar
杜庆泉 已提交
372 373 374
	}
}

杜庆泉's avatar
杜庆泉 已提交
375 376 377 378

/**
 * 链接指定wifi
 */
379
@Suppress("UNUSED_PARAMETER","DEPRECATION")
杜庆泉's avatar
杜庆泉 已提交
380 381
export function connectWifi(option: WifiConnectOption) {
	
382

杜庆泉's avatar
杜庆泉 已提交
383 384 385 386
	var result = {
		errCode: 12000,
		errMsg: "connectWifi:fail:not invoke startWifi",
		errSubject:"uni-connectWifi"
杜庆泉's avatar
杜庆泉 已提交
387 388
	}
	
杜庆泉's avatar
杜庆泉 已提交
389 390 391 392 393 394 395 396
	if (Global.mReceiver == null || Global.scanList.length < 1) {
		// 还没调用startWifi 提示报错
		option.fail?.(result)
		option.complete?.(result)
	
		return
	}
	
397 398 399
	if(option.maunal == true){
		// 指定了手动模式
		let manunalIntent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
400
		UTSAndroid.getUniActivity()!.startActivity(manunalIntent);
杜庆泉's avatar
杜庆泉 已提交
401
		
402 403
		result.errCode = 0
		result.errMsg = "connectWifi:ok"
杜庆泉's avatar
杜庆泉 已提交
404
		
405 406 407 408
		option.success?.(result)
		option.complete?.(result)
		return 
	}
杜庆泉's avatar
杜庆泉 已提交
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
	
	// 执行后续的逻辑
	let scanWifiInfo:UniWifiInfo|null = null
	for (let scanResult in Global.scanList) {
		
		if (scanResult.SSID.equals(option.SSID)) {
			scanWifiInfo = scanResult
		}
	}
	
	if(scanWifiInfo == null){
		// 不在扫描列表中返回错误
		option.fail?.(result)
		option.complete?.(result)
		
		return
	}
	
427
	console.log(JSON.stringify(scanWifiInfo.securityType));
杜庆泉's avatar
杜庆泉 已提交
428
	
429
	let wifiConfigration = wrapWifiConfiguration(option.SSID,option.password,scanWifiInfo.securityType);
杜庆泉's avatar
杜庆泉 已提交
430 431
	
	let wifiManager: WifiManager =
432
		UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
杜庆泉's avatar
杜庆泉 已提交
433
	
434
	// 如果已经存在了指定wifi 配置,移除之
杜庆泉's avatar
杜庆泉 已提交
435 436 437 438 439 440
	let targetExistConfig:WifiConfiguration|null = null
	let existingConfigs = wifiManager.getConfiguredNetworks();
	for (let existingConfig in existingConfigs) {
		if (existingConfig.SSID.equals("\"" + option.SSID + "\"")) {
			targetExistConfig = existingConfig
		}
杜庆泉's avatar
杜庆泉 已提交
441
		
杜庆泉's avatar
杜庆泉 已提交
442 443 444 445 446 447
	}
	
	if (targetExistConfig != null) {
		wifiManager.removeNetwork(targetExistConfig.networkId);
	}
	
448
	try {
杜庆泉's avatar
杜庆泉 已提交
449
		console.log(wifiConfigration);
450
		let netID = wifiManager.addNetwork(wifiConfigration);
杜庆泉's avatar
杜庆泉 已提交
451
		console.log("netID  === " + netID);
452
		let enabled = wifiManager.enableNetwork(netID, true);
杜庆泉's avatar
杜庆泉 已提交
453
		console.log("enabled  === " + enabled);
454
		let connected = wifiManager.reconnect();
杜庆泉's avatar
杜庆泉 已提交
455 456
		console.log("connected  === " + connected);
	
457 458 459 460 461 462
	} catch (e) {
		// TODO: handle exception
		console.log(e);
		// e.printStackTrace();
		
	}
杜庆泉's avatar
杜庆泉 已提交
463
	
464 465
	result.errCode = 0
	result.errMsg = "connectWifi:ok"
杜庆泉's avatar
杜庆泉 已提交
466
	
467 468
	option.success?.(result)
	option.complete?.(result)
杜庆泉's avatar
杜庆泉 已提交
469 470
	
	
杜庆泉's avatar
杜庆泉 已提交
471 472
}

杜庆泉's avatar
杜庆泉 已提交
473 474 475
/**
 * 开启wifi
 */
476
@Suppress("DEPRECATION")
杜庆泉's avatar
杜庆泉 已提交
477
export function startWifi(option: WifiOption) {
478
	
杜庆泉's avatar
杜庆泉 已提交
479 480 481
	// 需要先开启wifi,才能使用后续的功能
	let requestCode = 1001;
	let permissionWifi = arrayOf("android.permission.ACCESS_FINE_LOCATION");
打打卡夫卡's avatar
打打卡夫卡 已提交
482 483
	var result = {
		errCode: 12001,
484 485
		errMsg: "startWifi:premission loss",
		errSubject:"uni-startWifi"
打打卡夫卡's avatar
打打卡夫卡 已提交
486
	}
杜庆泉's avatar
杜庆泉 已提交
487
	// 检查权限
488
	if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
杜庆泉's avatar
杜庆泉 已提交
489

490
		ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, permissionWifi, requestCode)
杜庆泉's avatar
杜庆泉 已提交
491 492 493
		// 尚不具备权限,返回错误
		option.fail?.(result)
		option.complete?.(result)
杜庆泉's avatar
杜庆泉 已提交
494

杜庆泉's avatar
杜庆泉 已提交
495
		return;
杜庆泉's avatar
杜庆泉 已提交
496 497
	}

杜庆泉's avatar
杜庆泉 已提交
498 499
	// 具备了权限,继续前进
	let wifiManager: WifiManager =
500
		UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager
杜庆泉's avatar
杜庆泉 已提交
501

杜庆泉's avatar
杜庆泉 已提交
502 503 504
	if (Global.mReceiver == null) {
		Global.mReceiver = new CustomBroadcastReceiver(wifiManager)
	}
杜庆泉's avatar
杜庆泉 已提交
505

杜庆泉's avatar
杜庆泉 已提交
506 507
	let filter = new IntentFilter()
	filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
打打卡夫卡's avatar
打打卡夫卡 已提交
508
	// @ts-ignore
杜庆泉's avatar
杜庆泉 已提交
509
	filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
打打卡夫卡's avatar
打打卡夫卡 已提交
510
	// @ts-ignore
杜庆泉's avatar
杜庆泉 已提交
511
	filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
杜庆泉's avatar
杜庆泉 已提交
512

513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533
	UTSAndroid.getUniActivity()!.registerReceiver(Global.mReceiver, filter)
	
	/**
	 * activity 被销毁时,取消注册
	 */
	UTSAndroid.onAppActivityDestroy(function(){
		
		
		if(Global.mReceiver!= null){
			UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver)
			Global.mReceiver = null
			
			Global.scanList = []
			Global.getWifiListCallbackList = []
			Global.onWifiConnectCallbackList = []
			console.log("UTSAndroid.getUniActivity()  ==  " + UTSAndroid.getUniActivity());
			console.log("Global.mReceiver  ==  " + Global.mReceiver);
		}
		
	});
	
杜庆泉's avatar
杜庆泉 已提交
534
	wifiManager.startScan()
打打卡夫卡's avatar
打打卡夫卡 已提交
535 536 537
	result.errCode = 0
	result.errMsg = "startWifi:ok"
	
杜庆泉's avatar
杜庆泉 已提交
538 539
	option.success?.(result)
	option.complete?.(result)
杜庆泉's avatar
杜庆泉 已提交
540

541 542
}

杜庆泉's avatar
杜庆泉 已提交
543 544 545 546

/**
 * 关闭wifi
 */
杜庆泉's avatar
杜庆泉 已提交
547
export function stopWifi(option: WifiOption) {
杜庆泉's avatar
杜庆泉 已提交
548 549 550
	// 需要先开启wifi,才能使用后续的功能
	if (Global.mReceiver == null) {
		var result = {
杜庆泉's avatar
杜庆泉 已提交
551 552 553
			errNo: 12000,
			errCode: 12000,
			errMsg: "stopWifi:not init"
杜庆泉's avatar
杜庆泉 已提交
554 555 556
		}
		option.fail?.(result)
		option.complete?.(result)
杜庆泉's avatar
杜庆泉 已提交
557 558

		return
杜庆泉's avatar
杜庆泉 已提交
559
	}
560 561 562 563 564 565 566
	try{
		UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver)
	}catch(e){
		// 多次调用
		//TODO handle the exception
	}
	
杜庆泉's avatar
杜庆泉 已提交
567
	var result = {
杜庆泉's avatar
杜庆泉 已提交
568 569 570
		errNo: 0,
		errCode: 0,
		errMsg: "stopWifi:ok"
571
	}
杜庆泉's avatar
杜庆泉 已提交
572 573
	option.success?.(result)
	option.complete?.(result)
杜庆泉's avatar
杜庆泉 已提交
574

杜庆泉's avatar
杜庆泉 已提交
575 576 577 578 579
}

/**
 * 获取当前连接中的wifi信息
 */
580
@Suppress("DEPRECATION")
杜庆泉's avatar
杜庆泉 已提交
581
export function getConnectedWifi(option: GetConnectedWifiOptions) {
杜庆泉's avatar
杜庆泉 已提交
582

打打卡夫卡's avatar
打打卡夫卡 已提交
583 584 585 586 587
	let wifiInfo = new UniWifiInfo(null)

	var res = {
		errCode: 12000,
		errMsg: "getConnectedWifi:fail:not invoke startWifi",
588
		errSubject:"uni-getConnectedWifi",
打打卡夫卡's avatar
打打卡夫卡 已提交
589 590 591
		wifi:wifiInfo
	}

592
	if (Global.mReceiver == null) {
打打卡夫卡's avatar
打打卡夫卡 已提交
593 594 595
		// 还没调用startWifi 提示报错
		option.fail?.(res)
		option.complete?.(res)
596 597 598 599
	
		return
	}
	
600
	if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
杜庆泉's avatar
杜庆泉 已提交
601
		// 尚不具备权限,返回错误
打打卡夫卡's avatar
打打卡夫卡 已提交
602 603 604
		res.errCode = 12001
		res.errMsg = "getConnectedWifi:permission loss"
		
杜庆泉's avatar
杜庆泉 已提交
605 606 607
		option.fail?.(res)
		option.complete?.(res)
		return;
杜庆泉's avatar
杜庆泉 已提交
608 609
	}

610 611
	// TODO 应该try catch一下,把系统的错误码给返回来,然后和微信的错误码拉齐
	// 需要先校验权限,没有位置权限无法获取wifi
612
	const context = UTSAndroid.getAppContext();
613
	if (context != null) {
杜庆泉's avatar
杜庆泉 已提交
614 615 616
		const wm = context.getSystemService(
			Context.WIFI_SERVICE
		) as WifiManager;
杜庆泉's avatar
杜庆泉 已提交
617
		// 测试android 12上可以使用
打打卡夫卡's avatar
打打卡夫卡 已提交
618
		//@ts-ignore
杜庆泉's avatar
杜庆泉 已提交
619
		const winfo = wm.getConnectionInfo();
杜庆泉's avatar
杜庆泉 已提交
620
		// 封装成数据对象
打打卡夫卡's avatar
打打卡夫卡 已提交
621
		wifiInfo.wrapConnectInfo(winfo);
杜庆泉's avatar
杜庆泉 已提交
622

杜庆泉's avatar
杜庆泉 已提交
623 624
		res.errCode = 0
		res.errMsg = "getConnectedWifi:ok"
打打卡夫卡's avatar
打打卡夫卡 已提交
625
		res.wifi = wifiInfo;
杜庆泉's avatar
杜庆泉 已提交
626 627 628
		option.success?.(res)
		option.complete?.(res)
		return
629
	}
杜庆泉's avatar
杜庆泉 已提交
630 631
	option.fail?.(res)
	option.complete?.(res)
632
}