一.WifiP2p的描述
wifiP2p是不需要联网的,只需要手机打开wlan就可以连接通信的;底部的通信原理是Binder通信
二.WifiP2p的操作流程
1.权限申请
2.设置广播,用来获取WIfiP2p各种变化时候的信息
3.获取WifiP2pManager和WifiP2pManager.channel
4.开启扫描,两台手机都需要开启扫描
5.通过广播的回调获取到搜索的手机列表
6.连接;因为当两台手机连接的时候,会生成一个组,我们可以通过广播回调获取组的owner信息
7.socket通信,将组的owner做完服务端,其它做完客户端
三.权限申请
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
四.设置广播用来获取WifiP2p的各种变化时候的信息
public static IntentFilter initIntentFilter(){ IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); //当WifiP2p连接状态改变的时候回调,注意需要分清是关闭连接还是开启连接 intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); //当Wifi状态发生改变的时候调用, 也可能是Wifi开启和关闭 intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); //当wifi搜索列表发生改变的时候调用,可以获取Wifi搜索到的列表数据 intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); //当Wifi本身信息发生改变的时候调用,可以获取到自身Device的信息 return intentFilter; }
@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)){ NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); if(networkInfo.isConnected()){ WifiP2pInfo wifiP2pInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO); deviceActionListener.connect(wifiP2pInfo); deviceActionListener.updateStatus("连接状态中"); } }else if(action.equals(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)){ WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); List<WifiP2pDevice> p2pDeviceList = new ArrayList<>(); p2pDeviceList.addAll(wifiP2pDeviceList.getDeviceList()); deviceActionListener.updateDeviceList(p2pDeviceList); }else if(action.equals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)){ int status = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,-1); if (status == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { deviceActionListener.updateStatus("可用的。。。"); }else{ deviceActionListener.updateStatus("不可用。。。"); } }else if(action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)){ WifiP2pDevice wifiP2pDevice = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE); deviceActionListener.updateDeviceInformation(wifiP2pDevice); } }
上面获取数据的时候还可以使用WifiP2pManager.requestXXX某方法回调,
这里的DeviceActionListener是一个接口,这里采用的是接口回调与Activity进行通信
interface DeviceActionListener{ void connect(WifiP2pInfo wifiP2pInfo); void updateDeviceList(List<WifiP2pDevice> p2pDeviceList); void updateStatus(String text); void updateDeviceInformation(WifiP2pDevice wifiP2pDevice); }
五.获取WifiP2pManager和WifiP2pManager.channel
wifiP2pManager = (WifiP2pManager) this.getSystemService(WIFI_P2P_SERVICE); channel = wifiP2pManager.initialize(this,getMainLooper(),null);
六.开启扫描,两台手机都需要开启扫描
wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { Log.d("MainActivity","扫描成功了............."); } @Override public void onFailure(int i) { Log.d("MainActivity","扫描失败......"); } });
七. 通过广播的回调获取到搜索的手机列表
当获取到搜索列表的时候,就会触发 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 的事件,在广播中,我们可以通过 WifiP2pDeviceList wifiP2pDeviceList = intent.getParcelableExtra(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 获取到手机列表的数据。我们可以使用一个ListView来显示这些
手机数据。
八.连接
我们可以通过ListView的点击事件来设置连接,下面的wifiP2pDevice是你点击(ListView)某项的WifiP2pDevice
WifiP2pConfig wifiP2pConfig = new WifiP2pConfig(); wifiP2pConfig.deviceAddress = wifiP2pDevice.deviceAddress; wifiP2pConfig.wps.setup = WpsInfo.PBC; wifiP2pManager.connect(channel,wifiP2pConfig,null);
九.socket通信,将组的owner做完服务端,其它做完客户端
当连接成功的时候会调用广播的Wifi连接状态发生改变的事件,我们可以在里面获取到WifiP2pInfo信息,通过该对象我们可以获取组owner的interAddress;这个描述的代码都在上面的Receiver中。
然后就是将Owner做为ServerSocket,其他的作为Socket。