ref links:
api document: http://developer.android.com/reference/android/net/wifi/p2p/package-summary.html
demo: http://developer.android.com/resources/samples/WiFiDirectDemo/index.html
Overview
该API package是用于create connection with wifi direct协议(http://en.wikipedia.org/wiki/Wi-Fi_Direct)
使用该API,必须是android 4.0 (level 14) or later,而且支持wifi direct。Samsung Nexus是第一部符合条件的手机。
该package最重要的class是WifiP2pManager
,用它主要做下列事情:
1. Initialize your application for P2P connectionsby calling initialize()
2. Discover nearby devices by calling discoverPeers()
and requestPeers()
3.
Start a P2P connection by calling connect()
4. 还有其他功能:如disconnect P2P connection,获取connection info,创建group和get group info(见下面)
Listeners
该package几乎全部都是使用异步消息机制,因此你需要implement下面listener interfaces。
1. WifiP2pManager.ActionListener: WifiP2pManager的5个方法(cancelConnect, connect, createGroup, discoverPeers,removeGroup)都要用该listener作为参数 for receiving callback。
该listener有2个callback方法“onSuccess” and “onFailure(int)”,分别作为success and failure的callback。
onFailure(int)的参数值有3个:ERROR,P2P_UNSUPPORTED or BUSY
2. WifiP2pManager.ChannelListener: WifiP2pManager的initialize方法用该listener作为参数 for receivingcallback.
该listener有1个方法“onChannelDisconnected()”,作为wifi directchannel disconnect时的callback
3. WifiP2pManager.PeerListListener: WifiP2pManager的requestPeers方法用该listener作为参数 for receivingcallback.
该listener有1个方法“onPeersAvailable(WifiP2pDeviceList peers)”,作为当调用requestPeers来获取peer list成功时的callback.
4. WifiP2pManager.ConnectionInfoListener: WifiP2pManager的requestConnectionInfo方法用该listener作为参数 for receivingcallback.
该listener有1个方法“onConnectionInfoAvailable(WifiP2pInfo info)”,作为当调用requestConnectionInfo来获取requestedconnection info成功时的callback.
5. WifiP2pManager.GroupInfoListener: WifiP2pManager的requestGroupInfo方法用该listener作为参数 for receivingcallback.
该listener有1个方法“onGroupInfoAvailable(WifiP2pGroupgroup)”,作为当调用requestGroupInfo来获取requested group info成功时的callback.
WifiP2pManagerclass
关键方法:
l initialize(Context srcContext, Looper srcLooper,WifiP2pManager.ChannelListener listener)
用来initialize wifi,把本android app注册到wifi framwork里,并返回wifi frameworkchannel。在调用其他方法之前必须首先调用它
该方法的返回值是一个WifiP2pManager.Channelobject,它表示wifi framework channel。WifiManager的其他方法在调用时都会用该channel作为参数!
l discoverPeers(WifiP2pManager.Channel c, WifiP2pManager.ActionListener listener)
Initiate peerdiscovery.调用该方法会scan for available Wi-Fi peers。
The functioncall immediately returns after sending a discovery request to the framework,因为是异步消息机制. The application is notified of a success or failure to initiatediscovery through listener callbacks onSuccess() or onFailure(int).
The discoveryremains active until a connection is initiated or a p2p group is formed. Register for WIFI_P2P_PEERS_CHANGED_ACTION intent to determinewhen the framework notifies of a change as peers are discovered.
在收到WIFI_P2P_PEERS_CHANGED_ACTIONintent后,你就可以调用requestPeers(WifiP2pManager.Channel,WifiP2pManager.PeerListListener)来获取peer list!!
l requestPeers(WifiP2pManager.Channel c, WifiP2pManager.PeerListListener listener)
sendrequest to获取current list of peers。返回的peer list要在参数PeerListListener里的onPeersAvailable(WifiP2pDeviceList peers)方法里获取
l connect (WifiP2pManager.Channel c, WifiP2pConfig config,WifiP2pManager.ActionListener listener)
建立p2pconnection to a device with the specified configuration。
Theapplication is notified of a success or failure to initiate connect throughlistener callbacks onSuccess() or onFailure(int).
Register for WIFI_P2P_CONNECTION_CHANGED_ACTION intent todetermine when the framework notifies of a change in connectivity.
If the currentdevice is not part of a p2p group, a connect request initiates a groupnegotiation with the peer.
If thecurrent device is part of an existing p2p group or has created a p2p group withcreateGroup(WifiP2pManager.Channel, WifiP2pManager.ActionListener), aninvitation to join the group is sent to the peer device.
l requestConnectionInfo(WifiP2pManager.Channel c, WifiP2pManager.ConnectionInfoListenerlistener)
sendrequest to获取currentconnection info。返回的connection info要在参数ConnectionInfoListener里的onConnectionInfoAvailable(WifiP2pInfo info)方法里获取。
l cancelConnect(WifiP2pManager.Channel c, WifiP2pManager.ActionListener listener)
disconnect current connection
l createGroup(WifiP2pManager.Channel c, WifiP2pManager.ActionListener listener)
Create a p2p groupwith the current device as the group owner.This essentially creates an access point that can acceptconnections from legacy clients as well as other p2p devices.
Note: This function would normally not be used unless thecurrent device needs to form a p2p connection with a legacy client
Forcommunication with legacy Wi-Fi devices that do not support p2p, an app cancreate a group usingcreateGroup(WifiP2pManager.Channel, WifiP2pManager.ActionListener)which creates an access point whose details can be fetched withrequestGroupInfo(WifiP2pManager.Channel,WifiP2pManager.GroupInfoListener).
l requestGroupInfo(WifiP2pManager.Channel c, WifiP2pManager.GroupInfoListenerlistener)
l removeGroup(WifiP2pManager.Channel c, WifiP2pManager.ActionListener listener)
Wifi Direct BroadcastReceiver
APP要自己定义一个wifi direct broadcastReceiver (extends android.content.BroadcastReceiver),并register it。该receiver用来接收来自wifi framework的消息/意图通知 (event/intent notification)。
对于wifi direct p2p,有下面4个event/intentnotification我们需要在自定义的wifi direct broadcastReceiver里接收。注意,这4个event/intent是定义在WifiP2pManager class。
l WIFI_P2P_PEERS_CHANGED_ACTION:接收到的消息/意图是available peerlist发生了变化。
l WIFI_P2P_STATE_CHANGED_ACTION:接收到的消息/意图是Wi-Fi p2p的state发生变化。State有2种:enable and disable
l WIFI_P2P_CONNECTION_CHANGED_ACTION:接收到的消息/意图是Wi-Fi p2pconnectivity的state发生改变. State应该是connected and disconnected
l WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:接收到的消息/意图是正连接的device发生变化。
下面是define and register custom wifi direct broadcastreceiver的最简单例子:
//定义custom wifi direct broadcast receiver
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager manager;
private Channel channel;
public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel) {
super();
this.manager = manager;
this.channel = channel;
}
//当wifi framework broadcast 相关的intent时,就会callback 该onReceive方法!!
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); //获取意图
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { //意图为WIFI P2P State发生变化
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); //get WIFI P2P State
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { //WIFI P2P State为enable
...
} else { //WIFI P2P State为disable
...
}
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { //意图为WIFI P2P current peer list发生变化
if (manager != null) {
manager.requestPeers(channel, peerListListener); //send request to get current peers list
}
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { //意图为WIFI P2P connection state发生变化
if (manager == null) {
return;
}
NetworkInfo networkInfo = (NetworkInfo) intent
.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); //获取wifi p2p connection state
if (networkInfo.isConnected()) { //WIFI P2P connection state is "connected"
manager.requestConnectionInfo(channel, connectionInfoListener);
} else { //WIFI P2P connection state is "disconnected"
...
}
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { //意图为正连接的device发生变化发生变化
WifiP2pDevice device=((WifiP2pDevice) intent.getParcelableExtra(
WifiP2pManager.EXTRA_WIFI_P2P_DEVICE)); //获取正连接的device
....
}
}
}
//Register custom wifi direct broadcast receiver in your app activity
IntentFilter intentFilter = new IntentFilter();
//只filter和wifi p2p相关的4个intent,即表示只会收到这4个intent的broadcast message
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
WiFiDirectBroadcastReceiver receiver = new WiFiDirectBroadcastReceiver(manager, channel);
//register broadcast receiver
registerReceiver(receiver, intentFilter);
Simple Flow