Android10连接WiFi的方法

本文解析了Android Q中对WiFi权限的限制,介绍了如何在Android Q及以上版本使用NetworkRequest API进行连接,以及在旧版本中设置WiFi配置的方法。重点在于提供切换和连接WiFi的工作流程,适用于开发者应对新系统带来的挑战。

问题描述:关于连接WiFi失败的原因,在Android开发者平台上说明了对addNetwo这个方法的启用,并且Android Q不支持应用对WiFi进行开关操作。
原因:Android Q 将切断应用对 Wi-Fi 设置的访问权限,防止恶意软件滥用系统功能的访问权限。
在这里插入图片描述
针对开关WiFi的解决办法:

startActivity(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY))

针对连接WiFi的解决办法:
wifiName替换成想要连接的WiFi名称,wifiPassword替换成对应的密码。

f (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val specifier: NetworkSpecifier = WifiNetworkSpecifier.Builder()
                .setSsidPattern(PatternMatcher(wifiName, PatternMatcher.PATTERN_PREFIX))
                .setWpa2Passphrase(wifPassword)
                .build()
            val request = NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .setNetworkSpecifier(specifier)
                .build()
            val connectivityManager =
                requireActivity()!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val networkCallback: NetworkCallback = object : NetworkCallback() {
                override fun onAvailable(network: Network) {
                    // do success processing here..
                    when (upOrDown) {
                        "up" -> {
                            intoActivityWithBundle(ActivityHolder.SELECT_PERSONNEL, Bundle().apply {
                                putString("type", "upload")
                                putString("meetingId", meetingId)
                            })
                        }
                        "down" -> {
                            intoActivityWithBundle(ActivityHolder.SELECT_PERSONNEL, Bundle().apply {
                                putString("type", "download")
                                putString("meetingId", meetingId)
                            })
                        }
                    }
                }

                override fun onUnavailable() {
                    // do failure processing here..
                }
            }
            connectivityManager.requestNetwork(request, networkCallback)
            // Release the request when done.
            // connectivityManager.unregisterNetworkCallback(networkCallback);
        } else {//小于Android Q的版本
            val wifiSSID = "\"" + wifiName + "\""
            val wifiConfiguration = WifiConfiguration().apply {
                SSID = wifiSSID
                preSharedKey = "\"" + wifPassword + "\""
                hiddenSSID = true
                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                allowedProtocols.set(WifiConfiguration.Protocol.RSN)
                status = WifiConfiguration.Status.ENABLED
//                wepKeys[0] = "\"" +psd+ "\""
//                wepTxKeyIndex = 0
//                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
//                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40)
            }
            val wifiManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requireActivity().getSystemService(WifiManager::class.java)
            } else {
                requireActivity().applicationContext.getSystemService(Context.WIFI_SERVICE)
                    ?.let {
                        it as WifiManager
                    }

            }
            wifiManager?.run {
                addNetwork(wifiConfiguration)
                val config=  configuredNetworks.first {
                    it.SSID != null && it.SSID == wifiSSID
                }
                disconnect()
                Log.e("===","==networkId==${config.networkId}")
                val enableNetwork = enableNetwork(config.networkId, true)
                Log.e("===","==enableNetwork==$enableNetwork")
                val b = reconnect()
                Log.e("==","==reconnect=====$b")
            }

        }

参考博客:
https://shoewann0402.github.io/2019/03/20/android-q-beta-enable-and-disable-wifi/
https://www.jb51.net/article/183837.htm
官方:https://developer.android.google.cn/guide/topics/connectivity/wifi-bootstrap#kotlin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值