Android 11及以上Wi-Fi P2P无法发现设备,求解决方案
Android 11+ WiFi P2P 无法接收设备列表广播的解决方案
针对你遇到的Android 11及以上版本无法接收WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION广播的问题,可从权限、代码逻辑、系统配置三个方向排查修复:
一、权限调整
Android 11(API 30)
- 必须确保
ACCESS_FINE_LOCATION权限已通过运行时申请并获得用户授权。你的配置中ACCESS_FINE_LOCATION的maxSdkVersion=32覆盖了API 30,但Android 10+要求位置权限必须主动申请,且仅授予"大致位置"时会导致WiFi P2P扫描失效,需确保用户授予"精确位置"权限。
Android 12+(API 31)
- 移除
NEARBY_WIFI_DEVICES权限的neverForLocation标记。该标记会限制应用利用WiFi扫描获取设备信息的能力,而WiFi P2P发现依赖正常的扫描机制,修改后的权限声明如下:
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
- 若应用targetSdkVersion≥31,需确保已申请该权限(虽为普通权限,但部分厂商可能要求主动弹窗申请)。
二、代码逻辑优化
- 添加扫描结果回调
调用discoverPeers时不要传null作为ActionListener,可直接排查扫描请求是否被系统拒绝:
mP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d(TAG, "WiFi P2P扫描请求已发起"); } @Override public void onFailure(int reason) { Log.e(TAG, "扫描请求失败,错误码:" + reason); // 根据错误码处理:如权限不足、WiFi未开启等 } });
简化扫描启停逻辑
在WIFI_P2P_STATE_ENABLED分支中,无需先调用stopPeerDiscovery再启动扫描,频繁启停会触发系统扫描管控逻辑,直接调用discoverPeers即可。确保应用处于前台
Android 11+对后台应用的WiFi扫描频率有严格限制,若应用在后台运行,系统会抑制WIFI_P2P_PEERS_CHANGED_ACTION广播。建议将扫描逻辑绑定到前台操作(如用户点击按钮),或放在前台服务中执行。
三、补充Manifest配置
添加WiFi P2P硬件特性声明,帮助系统识别应用的硬件依赖:
<uses-feature android:name="android.hardware.wifi.direct" android:required="true" />
四、额外排查点
- 先通过系统设置的「WiFi直连」功能手动扫描设备,确认附近打印机是否能被系统识别。若系统无法扫描到,可能是打印机或设备硬件的兼容性问题。
- 检查
updatePeers方法的逻辑,排除因业务代码错误导致的设备列表未更新问题。
内容的提问来源于stack exchange,提问作者Jungwon
相关产品推荐
相关产品推荐

