因项目需要Pad端和手机端交互,采用wifi直连。查阅资料,大概写下一些资料和收获吧。注:大公司的代码带不出来,我也比较懒不想再认真去写一遍了,所以大概这个意思哦。
wifi直连也叫做wifi设备点对点连接(peer-peer),不需要连接热点或者网络,需要打开wifi,就可以查找到附近的设备。大概可以分为以下步骤:1.设置以下权限,并且注意最小sdk=14
2.创建一个广播接收器,通过创建IntentFilter来addAction得到各个特定事件的发生来进行回调.
创建一个新的 BroadcastReceiver 类,用来监听系统的Wi-Fi P2P状态的改变(在 onReceive方法中,添加一个条件来处理上面列出的各种P2P状态的变更。)
最后,在主活动激活时,注册意图过滤器(Intent Filter)和广播接收器;在主活动暂停时把它们注销。最好在onResume()和onPause()方法中完成该操作。
3.初始化得到WifiP2pManager和Channel实例,在onCreate()方法中初始化,如果是在Fragment中,initialize参数用Looper.getMainLooper(),
4.初始化搜索,只初始化了对等点的搜索。discoverPeers()方法启动了搜索线程,并立刻返回。系统通过调用给定的动作监听器的方法来进行初始化,并会在成功初始化对等点进程时通知你。同时,搜索也会持续进行,直到一个连接被初始化,或者一个P2P组形成。
5.获取搜索到设备列表, 获取对等点的列表并进行处理,首先实现 WifiP2pManager.PeerListListener 接口,它提供了Wi-Fi Direct检测到的对等点信息。注:在公司当时我是在这个方法里实现自动连接,保存到sharedPreference,然后如果有搜索到相同的设备名和地址,代码就不写出来了,有更好的想法的可以说下。
在广播onReceive()方法中以便在收到一个带有 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 动作的意图(Intent)时调用 requestPeers方法。把实现PeerListListener的类作为方法参数传进去进行监听器回调。
6.连接(后面具体说)这个是重点哦
为了连接一个对等点,需要先创建一个新的 WifiP2pConfig 对象,然后从代表你想连接的设备的 WifiP2pDevice 中拷贝数据进去。再调用 connect 方法。然后项目需求是Pad端一定要作为group owner,这时候config.groupOwnerIntent = 15,增加这句话并不能一定作为group owner,只是一个建议。
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
为了兼容传统的Wifi设备,Wifi_Direct其实还存在另一种使用方 式,暂且称为兼容模式。兼容模式的特点在于,只需要担任GroupOwner的设备支持Wifi_Direct,而其他设备只需要支持传统的Wifi就可以了(个人觉得其实这种使用模式很像Android的便携热点功能)。
7.连接信息获取要监听连接状态的变更,需要实现 WifiP2pManager.ConnectionInfoListener 接口,回调函数 onConnectionInfoAvailable将会在连接状态改变时通知。
回到广播接收器的onReceive方法中,修改监听WIFI_P2P_CONNECTION_CHANGED_ACTION的部分。收到该意图(Intent)时,调用 requestConnectionInfo。这是一个异步的调用,所以结果会传给作为参数的连接信息监听器。
8.断连
removeGroup是移除群组,断连所有设备。
cancelConnect是取消连接状态为Invited的设备
一些问题:
如何获得WifiP2pGroupInfo,它有什么用?