android12 SDK31 wifi开发(仅提供连接wifi的工具类)
android12设备上,连接wifi
- 说明
- 注意:我公司的工控屏,是android12、且已经root了的系统!!!
说明
最近在android12的已经Root的设备上开发连接wifi的功能,wifi的列表很轻松的获取到了,但是连接wifi的功能一直不行,以下仅仅提供连接wifi的工具类
注意:我公司的工控屏,是android12、且已经root了的系统!!!
以下是kotlin工具类:
import java.io.BufferedReader
import java.io.DataOutputStream
import java.io.InputStreamReaderobject MyWifiConnector {/*** 连接到指定 WiFi 网络(自动检测认证类型)** @param ssid WiFi 名称* @param password WiFi 密码* @return 连接是否成功*/fun connectToWifi(ssid: String, password: String): Boolean {return try {// 1. 扫描网络并获取认证类型val authType = detectAuthType(ssid) ?: run {// 如果无法检测到认证类型,尝试常见类型return tryConnectWithFallback(ssid, password)}// 2. 使用检测到的认证类型连接executeConnectCommand(ssid, authType, password)} catch (e: Exception) {e.printStackTrace()false}}/*** 扫描 WiFi 网络并检测指定 SSID 的认证类型*/private fun detectAuthType(targetSsid: String): String? {val process = Runtime.getRuntime().exec("su")val outputStream = DataOutputStream(process.outputStream)// 执行扫描命令outputStream.writeBytes("cmd wifi list-scan-results\n")outputStream.writeBytes("exit\n")outputStream.flush()// 读取扫描结果val reader = BufferedReader(InputStreamReader(process.inputStream))val response = StringBuilder()var line: String?while (reader.readLine().also { line = it } != null) {response.append(line).append("\n")}process.waitFor()outputStream.close()// 解析扫描结果,查找目标 SSIDval lines = response.toString().split("\n")for (line in lines) {if (line.contains(targetSsid)) {// 解析认证类型return when {line.contains("WPA3", ignoreCase = true) -> "wpa3"line.contains("WPA2", ignoreCase = true) -> "wpa2"line.contains("WPA", ignoreCase = true) -> "wpa"line.contains("WEP", ignoreCase = true) -> "wep"line.contains("ESS", ignoreCase = true) && !line.contains("PSK",ignoreCase = true) -> "open"else -> null}}}return null}/*** 尝试使用常见认证类型连接*/private fun tryConnectWithFallback(ssid: String, password: String): Boolean {// 尝试常见认证类型val authTypes = listOf("wpa2", "wpa", "wep", "open")for (authType in authTypes) {if (executeConnectCommand(ssid, authType, password)) {return true}// 等待片刻再尝试下一种类型Thread.sleep(1000)}return false}/*** 执行实际的连接命令*/private fun executeConnectCommand(ssid: String, authType: String, password: String): Boolean {return try {val process = Runtime.getRuntime().exec("su")val outputStream = DataOutputStream(process.outputStream)// 构建连接命令val command = "cmd wifi connect-network \"$ssid\" $authType \"$password\"\n"outputStream.write(command.toByteArray())outputStream.writeBytes("exit\n")outputStream.flush()// 读取输出val reader = BufferedReader(InputStreamReader(process.inputStream))val response = StringBuilder()var line: String?while (reader.readLine().also { line = it } != null) {response.append(line).append("\n")}process.waitFor()outputStream.close()// 检查连接结果response.toString().contains("Connection initiated", ignoreCase = true)} catch (e: Exception) {false}}
}