You need to enable JavaScript to run this app. Android10+ WIFI_P2P_CONNECTION_CHANGED_ACTION非粘性广播适配方案
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 19:06:03