Android 8.0(Oreo)设备Wifi p2p discoverPeers()无法发现对等设备求助
我之前处理过类似的Wifi P2P跨版本兼容性问题,给你几个针对性的排查和解决方向:
位置权限与服务的强制要求
Android 8.0对Wifi P2P的权限管控更严格,不仅要在Manifest中声明ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION,还必须在运行时主动申请并获得用户授权。另外,一加的OxygenOS这类定制ROM通常要求必须开启系统位置服务,否则Wifi P2P扫描会静默失败——你可以先检查OnePlus 5的位置服务是否开启,同时确认应用已经拿到了位置权限。动态注册Wifi P2P广播接收器
Android 8.0开始限制了隐式广播的静态注册,原来在Manifest里注册的WIFI_P2P_PEERS_CHANGED_ACTION等关键广播接收器可能无法正常触发。你需要改成在代码里动态注册:WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), null); BroadcastReceiver receiver = new WifiP2pBroadcastReceiver(manager, channel, this); IntentFilter filter = new IntentFilter(); filter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); filter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); registerReceiver(receiver, filter);记得在Activity销毁时调用
unregisterReceiver()避免内存泄漏。调整扫描触发逻辑
Android 8.0对Wifi P2P扫描的频率有限制,连续调用discoverPeers()可能会被系统限流。建议扫描前先通过isWifiP2pEnabled()确认模块已启用,且每次扫描间隔至少保持2-3秒。另外,不要在调用discoverPeers()后立即获取对等设备列表,要等WIFI_P2P_PEERS_CHANGED_ACTION广播触发后,再调用requestPeers()获取最新列表。排查定制ROM的兼容性问题
一加的OxygenOS对原生Android的Wifi P2P可能有定制修改,你可以用一台原生Android 8.0设备测试同样的代码,看是否能正常发现低版本设备。如果原生设备正常,那大概率是一加ROM的问题,可以去一加官方论坛看看有没有相关解决方案,或者把系统更到最新版本。另外,关闭OnePlus 5的蓝牙、热点等其他无线功能,避免干扰Wifi P2P扫描。通过系统日志定位问题
抓取OnePlus 5的Wifi P2P相关日志能快速定位根源,用以下adb命令过滤日志:adb logcat -s WifiP2pService WifiP2pManager看看扫描过程中有没有
Permission denied、Scan request ignored这类错误提示,它们会直接指向问题所在。
内容的提问来源于stack exchange,提问作者Neeraj Athalye

