Kotlin中如何用ActivityResultContract获取WiFi设置返回的布尔结果
解决ActivityResultContract从WiFi设置页面返回始终false的问题
问题根源
Android系统自带的WiFi设置页面(Settings.ACTION_WIFI_SETTINGS),无论用户是主动按返回键退出,还是修改设置后退出,都会返回RESULT_CANCELED,永远不会返回RESULT_OK。你原代码中用resultCode == Activity.RESULT_OK作为判断条件,自然永远返回false。
解决方案
要实现“从WiFi设置页面返回时返回true,其他场景返回false”的需求,可按以下方式修改:
1. 修正ActivityResultContract代码
修改parseResult的判断逻辑,只要进入该方法,就说明用户是从WiFi设置页面返回的,直接返回true:
class WifiSettingChangeContract : ActivityResultContract<Unit?, Boolean>() { override fun createIntent(context: Context, input: Unit?): Intent { return Intent(Settings.ACTION_WIFI_SETTINGS) } override fun parseResult(resultCode: Int, intent: Intent?): Boolean { // 只要触发该方法,就代表用户从WiFi设置页面返回 return true } }
2. 处理启动失败的场景
如果设备不支持WiFi,或者因系统限制无法启动WiFi设置页面,调用launch时会抛出ActivityNotFoundException,此时可捕获异常并处理返回false的逻辑:
// 在Activity/Fragment中注册Contract val wifiSettingContract = registerForActivityResult(WifiSettingChangeContract()) { isFromWifiSettings -> // 这里isFromWifiSettings为true,代表从WiFi设置页面返回 } // 启动WiFi设置页面时的调用逻辑 try { wifiSettingContract.launch(null) } catch (e: ActivityNotFoundException) { // 无法启动WiFi设置页面,处理返回false的场景 }
补充说明
你提到的“从锁屏等其他页面返回”不会触发parseResult回调——只有当用户关闭WiFi设置页面时,才会执行parseResult并返回true;锁屏回到应用属于应用从后台唤醒,不会触发该Contract的回调逻辑,无需额外处理。
内容的提问来源于stack exchange,提问作者Blazerstrom
相关产品推荐
相关产品推荐

