Android平台WiFi-Direct可用示例代码及功能有效性咨询
WiFi Direct在Android 10/12上的可用性与解决方案
一、WiFi Direct并未被废弃
Android官方并未废弃WiFi Direct功能,从Android 10到最新的Android 14系统文档中,依然保留了完整的WiFi Direct API说明。你遇到的功能异常,大概率是厂商系统定制限制或权限/代码适配问题导致的。
二、问题排查关键点
- 权限缺失:
Android 10及以上需要ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION运行时权限;Android 12+新增NEARBY_WIFI_DEVICES权限,必须在Manifest中声明,且扫描设备时需配合位置权限使用(部分厂商要求必须开启系统定位服务)。 - 厂商定制限制:
三星、OPPO等品牌的部分机型会对WiFi Direct做功能阉割,比如默认禁用群组创建、强制要求开启定位才能扫描设备,甚至直接隐藏相关系统接口。 - 代码适配漏洞:
你使用的修改版代码可能未适配高版本系统的权限逻辑,或者广播接收器注册、API调用流程存在错误。
三、可用的Kotlin基础实现代码
1. Manifest权限配置
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:minSdkVersion="31" /> <uses-feature android:name="android.hardware.wifi.direct" android:required="true" />
2. 核心功能代码
import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.wifi.p2p.WifiP2pManager import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class WiFiDirectDemo : AppCompatActivity() { private lateinit var wifiP2pManager: WifiP2pManager private lateinit var p2pChannel: WifiP2pManager.Channel private val p2pReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { when (intent?.action) { // WiFi Direct状态变更 WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION -> { val state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1) if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { // WiFi Direct已激活 } } // 对等设备列表更新 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> { wifiP2pManager.requestPeers(p2pChannel) { peerList -> // 处理扫描到的设备列表 } } // 连接状态变更 WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION -> { // 处理连接/断开事件 } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化WiFi Direct管理器 wifiP2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager p2pChannel = wifiP2pManager.initialize(this, mainLooper, null) // 注册广播接收器 val filter = IntentFilter().apply { addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION) addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION) addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION) } registerReceiver(p2pReceiver, filter) } // 启动设备扫描 fun startPeerDiscovery() { wifiP2pManager.discoverPeers(p2pChannel, object : WifiP2pManager.ActionListener { override fun onSuccess() { // 扫描启动成功 } override fun onFailure(reasonCode: Int) { // 扫描失败,根据code排查:1=未支持,2=WiFi关闭,3=内部错误 } }) } // 创建WiFi Direct群组 fun createP2pGroup() { wifiP2pManager.createGroup(p2pChannel, object : WifiP2pManager.ActionListener { override fun onSuccess() { // 群组创建成功 } override fun onFailure(reasonCode: Int) { // 群组创建失败 } }) } override fun onDestroy() { super.onDestroy() unregisterReceiver(p2pReceiver) } }
四、热点替代方案的可行性
如果WiFi Direct在目标机型上兼容性极差,用热点+Socket通信确实是更稳定的选择:
- 优势:几乎所有Android设备都支持热点功能,API适配成本低,功能稳定性远高于WiFi Direct
- 局限:Android 10+需要动态申请
ACCESS_FINE_LOCATION和CHANGE_WIFI_STATE权限;部分厂商限制代码自动开启热点,需要用户手动操作;同一热点最多支持10-15台设备连接
内容的提问来源于stack exchange,提问作者norlesh
相关产品推荐
相关产品推荐

