android - Android 10+ (API 29+) 以编程方式在后台连接到 Wi-fi
问题描述
在我的 Flutter 应用程序中,我使用原生 Android 代码(在 Kotlin 中)以编程方式连接到特定的 Wi-Fi。对于 Android 10+,我需要使用网络说明符。它有效,但前提是应用程序位于前台。在后台,我总是以onUnavailable
回调结束。
在我的特定用例中,该应用程序连接到一个高度不稳定的 Wi-Fi(它会一直关闭并打开)。即使显示屏关闭,我也需要该应用程序能够在没有任何用户交互的情况下重新连接。
有没有办法在后台连接到特定网络?
val specifier = WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setBssid(MacAddress.fromString(macAddressString))
.apply {
if (isWpa3 != null && isWpa3) {
setWpa3Passphrase(password)
} else {
setWpa2Passphrase(password)
}
}
.build()
var request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build()
this.networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
// Success
}
override fun onUnavailable() {
super.onUnavailable()
// Unavailable
// Always end up here with display off
}
}
// Defined elsewhere
connectivityManager.requestNetwork(request, networkCallback)
解决方案
推荐阅读
- javascript - 如何根据属性键过滤对象属性?
- c# - 在自定义 JSON 转换器中忽略具有属性的属性
- laravel - Laravel:跨数据透视表查询特定行
- rest - Blazor Webassembly 项目调用 REST API
- angular - Angular:为什么在“if 语句”中可以使用 const 作为布尔值?
- visual-studio-2019 - Visual Studio 2019 Release 文件夹中的哪些文件应该上传到 GitHub?
- c - 在没有 btsl 指令的情况下使用 inline asm 设置位
- node.js - 如何替换在 docker 容器内运行的 react js 应用程序的品牌资源(徽标、背景图像)
- delphi - 对控件进行分组的非可视组件,以便我可以使用对齐?
- c - 如何教授 Visual Studio Code 关于 __fp16?