Android - 以编程方式关闭 Wi-Fi dialog/panel
Android - Programatically close the Wi-Fi dialog/panel
Android 29 已放弃以编程方式 enable/disable phone 的 Wi-Fi 接口的能力。我使用的应用程序以编程方式连接到外部 Wi-Fi 设备(p2p,无出站互联网)。如果未启用 wi-fi,我们会要求用户启用它。
有一个新系统 UI 面板 API 已记录 here。我们可以通过以下方式向用户显示一个基本的切换开关以启用 wi-fi:
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
启用 Wi-Fi 后,我们将通过下述过程进行连接:
例如:
val ssid = ssidObtainedExternally()
val psk = pskObtainedExternally()
val specifier = WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(psk)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build()
connectivityManager.requestNetwork(request, networkCallback)
但是,一个问题是,在用户将开关切换为启用后,同一对话框将开始显示可用的 Wi-Fi 网络列表,这可能会诱使客户选择 Wi-Fi 设备(因为 SSID 只是他们知道的设备名称)。由于我们将以编程方式连接,因此我们不希望用户尝试手动 select Wi-Fi 网络,因为他们不知道 PSK。一旦他们将开关切换为启用,最好立即关闭对话框。
我用 GoPro 8 对此进行了测试,该应用程序似乎有一种机制可以在用户切换开关后关闭对话框。
到目前为止,我已经尝试了一些方法,但都没有成功。我尝试使用 Application.registerActivityLifecycleCallbacks,但它没有选择正在创建、启动或恢复的设置面板。
我也试过这里的提示:
运气不好(唯一可见的活动是在我的应用程序中声明的堆栈中的活动)
有什么想法吗?
看来我找到了一个似乎有效的 hack,可能是 gopro 应用程序所做的。这个想法是在启动 Wifi 设置面板后保留对当前 activity 的引用。一旦检测到 Wifi 已启用,请调用
yourPreviousActivity.startActivity(yourPreviousActivityIntent)
意图代表您之前所在的屏幕。您需要将以下标志添加到意图中:
FLAG_ACTIVITY_CLEAR_TOP
最终结果是您的 activity 是 re-launched 并且设置面板被隐藏。
如果您有任何动画在打开时运行,您将需要禁用它。
Android 29 已放弃以编程方式 enable/disable phone 的 Wi-Fi 接口的能力。我使用的应用程序以编程方式连接到外部 Wi-Fi 设备(p2p,无出站互联网)。如果未启用 wi-fi,我们会要求用户启用它。 有一个新系统 UI 面板 API 已记录 here。我们可以通过以下方式向用户显示一个基本的切换开关以启用 wi-fi:
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
启用 Wi-Fi 后,我们将通过下述过程进行连接:
例如:
val ssid = ssidObtainedExternally()
val psk = pskObtainedExternally()
val specifier = WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(psk)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build()
connectivityManager.requestNetwork(request, networkCallback)
但是,一个问题是,在用户将开关切换为启用后,同一对话框将开始显示可用的 Wi-Fi 网络列表,这可能会诱使客户选择 Wi-Fi 设备(因为 SSID 只是他们知道的设备名称)。由于我们将以编程方式连接,因此我们不希望用户尝试手动 select Wi-Fi 网络,因为他们不知道 PSK。一旦他们将开关切换为启用,最好立即关闭对话框。
我用 GoPro 8 对此进行了测试,该应用程序似乎有一种机制可以在用户切换开关后关闭对话框。
到目前为止,我已经尝试了一些方法,但都没有成功。我尝试使用 Application.registerActivityLifecycleCallbacks,但它没有选择正在创建、启动或恢复的设置面板。
我也试过这里的提示: 运气不好(唯一可见的活动是在我的应用程序中声明的堆栈中的活动)
有什么想法吗?
看来我找到了一个似乎有效的 hack,可能是 gopro 应用程序所做的。这个想法是在启动 Wifi 设置面板后保留对当前 activity 的引用。一旦检测到 Wifi 已启用,请调用
yourPreviousActivity.startActivity(yourPreviousActivityIntent)
意图代表您之前所在的屏幕。您需要将以下标志添加到意图中:
FLAG_ACTIVITY_CLEAR_TOP
最终结果是您的 activity 是 re-launched 并且设置面板被隐藏。 如果您有任何动画在打开时运行,您将需要禁用它。