Android10+ WIFI_P2P_CONNECTION_CHANGED_ACTION非粘性广播适配方案
Android 10+ 适配WiFi P2P连接状态捕获的实现方案
核心问题根因
Android 10 开始,WIFI_P2P_CONNECTION_CHANGED_ACTION不再是粘性广播:
- 应用完成广播接收器注册时,无法再像旧版本一样,直接收到一次携带当前实时连接状态的粘性广播
- 仅当后续连接状态产生新的变更时,接收器才能收到对应广播
- 如果应用启动时设备已经处于P2P连接状态,原有逻辑完全感知不到已存在的连接,最终表现为应用无法响应Intent、无法获取P2P连接信息
具体修改方案
1. 保留并优化现有广播接收逻辑
你现有广播接收器中处理WIFI_P2P_CONNECTION_CHANGED_ACTION的核心逻辑可直接保留,仅需补全空值防护避免崩溃:
else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { if (manager != null) { // 补充空判断,避免异常场景下intent extra为空引发空指针 NetworkInfo mNetworkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); if (mNetworkInfo != null && mNetworkInfo.isConnected()) { manager.requestConnectionInfo(channel, mainActivity.mConnectionInfoListener); } else { mainActivity.status.setText("Device Disconnected"); Log.d(TAG, "onReceive: connection ended. device disconnected"); } } }
该逻辑的作用是:当运行过程中连接状态发生变化时,接收器能正常捕获事件,获取最新的连接信息。
2. 实现初始化阶段的主动状态查询(替代粘性广播的初始状态投递)
官方提到的「初始化时调用合适的get方法」,本质就是在应用完成WiFi P2P服务初始化、拿到有效系统通信通道后,主动向系统查询一次当前的P2P连接状态,模拟旧版本粘性广播的首次状态投递效果,具体实现步骤:
- 定位到MainActivity中初始化
WifiP2pManager、初始化P2P通信通道、动态注册广播接收器的代码块(一般在onCreate方法中) - 在完成广播注册操作后,新增一次主动的状态查询,不需要等待广播触发:
// MainActivity onCreate 中原有初始化逻辑示例 WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), null); // 原有逻辑:动态注册WiFi P2P相关广播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); registerReceiver(mBroadcastReceiver, intentFilter); // 新增逻辑:初始化阶段主动查询当前P2P连接状态 manager.requestNetworkInfo(channel, networkInfo -> { if (networkInfo != null && networkInfo.isConnected()) { // 若设备已处于P2P连接状态,直接查询详细连接信息,复用现有ConnectionInfoListener逻辑 manager.requestConnectionInfo(channel, mConnectionInfoListener); } else { // 若未连接,更新UI状态 status.setText("Device Disconnected"); } });
- 涉及的两个核心方法说明:
requestNetworkInfo:主动向系统查询当前WiFi P2P网络的连接状态,无广播触发依赖,就是官方说明中要求的初始化阶段使用的状态查询方法requestConnectionInfo:主动查询当前P2P群组的详细连接信息(包括群组是否建立、设备角色、组所有者IP地址),和原有逻辑中在广播里调用的方法完全一致
适配注意事项
- 必须采用动态注册的方式监听
WIFI_P2P_CONNECTION_CHANGED_ACTION,Android 8.0之后系统已经限制了大部分隐式广播的静态注册,静态注册无法正常收到该广播 - 需要在Manifest中申请对应权限:
ACCESS_FINE_LOCATION(Android 10及以上WiFi设备发现流程强制要求)、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE - 页面销毁时记得反注册广播接收器,避免内存泄漏
内容的提问来源于stack exchange,提问作者Hamzah Zabin
相关产品推荐
相关产品推荐

