Android Q WIFI连接问题 汇总

1.WIFI连接


var connectivityManager: ConnectivityManager? =null

    // WiFi连接回调

    val networkCallback: ConnectivityManager.NetworkCallback =

    object : ConnectivityManager.NetworkCallback() {

    override fun onUnavailable() {

    super.onUnavailable() 

    //  WIFI连接失败 

    }

    override fun onAvailable(network: Network) {

    super.onAvailable(network)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

    //  这行必加 不然连上无网络

    connectivityManager?.bindProcessToNetwork(network)

    };


    }


2.连接WIFI

@RequiresApi(Build.VERSION_CODES.Q)

private fun connectWifiQ(pwd: String, it: WifiBean) {

timerStop()

val specifier: NetworkSpecifier = WifiNetworkSpecifier.Builder()

.setBssid(MacAddress.fromString(it.scanResult.BSSID)) // 名称  

.setWpa2Passphrase(pwd)  // 密码

.build()

val request: NetworkRequest = NetworkRequest.Builder()

.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)

.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)

.setNetworkSpecifier(specifier)

.build()

connectivityManager =

applicationContext.getSystemService(CONNECTIVITY_SERVICE)as ConnectivityManager

currentBssID = it?.scanResult.BSSID

    it?.pwd = pwd

if (networkCallback !=null) {

connectivityManager?.requestNetwork(request, networkCallback)

}

}

3.断开  
 //这里解除绑定  会断网  不知道为什么  
fun disConnectWifi() {

if (networkCallback !=null) {

connectivityManager?.unregisterNetworkCallback(networkCallback)

}

}


推荐用这种方式

@SuppressLint("MissingPermission")

fun getNewWorkId(wifiManager: WifiManager, SSID: String): Int {

wifiManager.configuredNetworks?.forEach {

        if (stringReplace(it.SSID)== SSID) {

var disableNetwork =    wifiManager.disableNetwork(it.networkId)

var removeNetwork =  wifiManager.removeNetwork(it.networkId)

if ( stringReplace(it.SSID) == getConnectedWifiInfo(wifiManager)?.ssid ){  //如果需要断开 则调用   否则  不调用disconnet 断开

    var disconnect =      wifiManager.disconnect()

}

AppLog.getInstance().i("getNewWorkId 1  =  ${ it.networkId} disableNetwork =$disableNetwork  removeNetwork= $removeNetwork disconnect= $disconnect")

return it.networkId;

        }

}

    AppLog.getInstance().i("not find networkId ")

return 0;

}

//符号替换

private fun stringReplace(str: String): String? {

return str.replace("\"", "")

}
// 获取当前连接的wifi 信息
private fun getConnectedWifiInfo( wifiManager: WifiManager): WifiInfo? { val info: WifiInfo = wifiManager.connectionInfo return if ("0x" == info.ssid) { null } else info}

写在最后  问题   
如果绑定后不解绑   断开该wifi 之后    即便连接了网络也无法访问网络  拿到  Ip  
connectivityManager?.bindProcessToNetwork(network)

列如:  直接获取不到   

fun getLocalIp(): String {
 

var ipAddress =""

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

try {

val manager =

getContext().getSystemService(Context.CONNECTIVITY_SERVICE)as ConnectivityManager

val networkInfo = manager.activeNetwork

            val prop = manager.getLinkProperties(networkInfo)

val iface = NetworkInterface.getByName(prop?.interfaceName)

AppLog.getInstance().e("getLocalIp error iface: ${iface}")

AppLog.getInstance().e("getLocalIp error iface.inetAddresses: ${iface.inetAddresses}")

val net: Enumeration = iface.inetAddresses

            // 遍历每一个接口绑定的所有ip

            while (net.hasMoreElements()) {

var ip: InetAddress = net.nextElement()

if (!ip.isLoopbackAddress && ipis Inet4Address &&ip.isSiteLocalAddress) {

ipAddress =ip.hostAddress

                    AppLog.getInstance().i("ProjetionLog  networkName = ${NetworkUtils.getNetName()} ; getLocalIp = $ipAddress")

return ipAddress

}

}

}catch (e: Exception) {

AppLog.getInstance().e("getLocalIp error : ${e.message}")

}

return ipAddress

}else return ipAddress

}

解绑 推荐使用在 网络广播  
// 网络变化监听
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")


/**

val intentFilter: IntentFilter = IntentFilter()

* 网络监听

*/

val mNetWorkReceiver =object : BroadcastReceiver() {

@RequiresApi(Build.VERSION_CODES.M)

override fun onReceive(context: Context?, intent: Intent?) {

var    connectivityManager =

context?.getSystemService(AppCompatActivity.CONNECTIVITY_SERVICE)as ConnectivityManager


connectivityManager?.bindProcessToNetwork(null)   //在这里进行解绑

netWorkChange?.invoke()

}

}

registerReceiver(netWorkBroadcast.mNetWorkReceiver, netWorkBroadcast.intentFilter)


关于解绑 : connectivityManager?.bindProcessToNetwork(it) 该方法是绑定应用只走该通道 

 换绑:

var connectivityManager =

context?.getSystemService(AppCompatActivity.CONNECTIVITY_SERVICE)as ConnectivityManager

connectivityManager?.bindProcessToNetwork(null)

connectivityManager.allNetworks.forEach {

    if (connectivityManager.getNetworkInfo(it)?.isConnected ==true) {

connectivityManager?.bindProcessToNetwork(it)

AppLog.getInstance().i("bindProcessToNetwork ${connectivityManager.getNetworkInfo(it)}")

}

}

有系统签名权限   可以直接用这种连接方式 

连接WIFI

TestConnect.connectWifi(wifiManager , TestConnect.createWifiInfo( SSID ,  pwd, false ,ScanResult.capabilities))}")

断开WIFI


TestConnect.disConnect(wifiManager , WifiConfiguration.networkId)

工具类:

/**

* @author as752497576@gmail.com

* @description

* @time 2023/8/23

*/

public class TestConnect {

/**

    * 连接wifi

*

    * @param manager      WifiManager

    * @param configuration Wifi配置

    * @return 是否连接成功

    */

    public static boolean connectWifi(WifiManager manager, WifiConfiguration configuration) {

int id = manager.addNetwork(configuration);

        WifiInfo connectionInfo = manager.getConnectionInfo();

        manager.disableNetwork(connectionInfo.getNetworkId());

        boolean b = manager.enableNetwork(id, true);

        Log.d("WifiManagerUtils", "connectWifi: 连接状态=" + b);

        if (b) {

manager.saveConfiguration();

        }else {

Log.d("WifiManagerUtils", configuration.toString());

        }

return b;

    }

/**

    * 创建Wifi配置

    *

    * @param SSID        wifi名称

    * @param password    wifi密码

    * @param hidden      网络是否隐藏(该方法与添加隐藏网络通用)

    * @param capabilities 网络安全协议

    * @return 配置好的wifi

*/

    public static WifiConfigurationcreateWifiInfo(String SSID, String password, boolean hidden, String capabilities) {

WifiConfiguration configuration =new WifiConfiguration();

        configuration.SSID ="\"" + SSID +"\"";

        if (hidden) {

configuration.hiddenSSID =true;

        }

Log.d("WifiManagerUtils", "createWifiInfo: " + capabilities);

        if (capabilities.contains("SAE") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

Log.d("WifiManagerUtils", "createWifiInfo SAE "  );

            setWPA3(configuration, password);

        }else if (capabilities.contains("WPA-PSK") || capabilities.contains("WPA2-PSK")) {

Log.d("WifiManagerUtils", "createWifiInfo WPA-PSK "  );

            setWPA(configuration, password);

        }else if (capabilities.contains("WEP")) {

Log.d("WifiManagerUtils", "createWifiInfo WEP "  );

            setWEP(configuration, password);

        }else {

setESS(configuration);

        }

return configuration;

    }

/**

    * 设置wpa3协议

    *

    * @param configuration 配置

    * @param password      密码

    */

    public static void setWPA3(WifiConfiguration configuration, String password) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);

        }

configuration.preSharedKey ="\"" + password +"\"";

    }

/**

    * WPA协议

    *

    * @param configuration 配置

    * @param password      密码

    */

    public static void setWPA(WifiConfiguration configuration, String password) {

configuration.preSharedKey ="\"" + password +"\"";

        //公认的IEEE 802.11验证算法。

        configuration.allowedAuthAlgorithms.clear();

        configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

        //公认的的公共组密码。

        configuration.allowedGroupCiphers.clear();

        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

        //公认的密钥管理方案。

        configuration.allowedKeyManagement.clear();

        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

        //密码为WPA。

        configuration.allowedPairwiseCiphers.clear();

        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

        configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

        //公认的安全协议。

        configuration.allowedProtocols.clear();

        configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

    }

/**

    * WEP协议

    *

    * @param configuration 配置

    * @param password      密码

    */

    public static void setWEP(WifiConfiguration configuration, String password) {

configuration.wepKeys[0] ="\"" + password +"\"";

        configuration.wepTxKeyIndex =0;

        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

        configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

    }

/**

    *  断开WIFI

*/

    public static void disConnect(WifiManager wifiManager,  int networkId) {

boolean    disableNetwork = wifiManager.disableNetwork(networkId);

        boolean removeNetwork = wifiManager.removeNetwork(networkId);

        //  如上面无法断开 则wifiManager.disconnect()

    }

/**

    * 无密码

    *

    * @param configuration 配置

    */

    public static void setESS(WifiConfiguration configuration) {

configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容