概述:
Wi-Fi peer-to-peer(P2P)让Android4.0及之后版本的设备可以使用合适的硬件来通过WiFi直接连接对方而不用中间访问点. 使用这些API, 我们可以发现和连接其它支持WiFi P2P的设备, 并可以跨越比蓝牙远的多的距离高速通信. 这对那些需要在用户间共享数据的APP很有用, 比如一个多用户游戏或者照片分享APP. WiFi P2P包含这些主要的部分:
l 可以让我们发现, 请求和连接的定义在WifiP2pManager类中的方法.
l 可以提醒我们WifiP2pManager方法调用成功或者失败的监听器. 当调用WifiP2pManager中的方法, 每个方法都传递收到一个指定的listener作为参数.
l 当WiFi P2Pframework检测到指定事件的时候通过intent提醒我们. 比如丢失连接或者发现了新的目标.
我们会经常一起使用这三个组件. 栗如, 可以提供一个WifiP2pManager.ActionListener给discoverPeers(), 这样就可以得到ActionListener.onSuccess()和ActionListener.onFailure()的提醒. 当discoverPeers()发现peer列表发生变化的时候会发出一个WIFI_P2P_PEERS_CHANGED_ACTION的intent广播.
API总览:
WifiP2pManager类提供了很多方法允许我们使用WiFi硬件来做比如发现和连接到其它设备的操作. 我们可以做这些事儿:
方法 |
描述 |
initialize() |
注册APP到WiFi framework. 必须先于任何WiFi方法执行. |
connect() |
启动一个与指定配置的设备的P2P连接. |
cancelConnect() |
取消任何正在进行的P2P连接. |
requestConnectInfo() |
请求设备的连接信息. |
createGroup() |
通过当前设备作为一个组的拥有者创建一个P2P组. |
removeGroup() |
移除当前的P2P组. |
requestGroupInfo() |
请求P2P组信息. |
discoverPeers() |
初始化peer发现. |
requestPeers() |
请求当前发现的peer的列表. |
WifiP2pManager中的方法可以接收监听器, 这样WiFi P2Pframework可以提醒我们的activity状态变化. 可用的监听器接口和相应的WifiP2pManager方法可以参考下表:
监听器接口 |
关联方法 |
WifiP2pManager.ActionListener |
Connect(), cancelConnect(), createGroup(), removeGroup(), discoverPeers() |
WifiP2pManager.ChannelListener |
Initialize() |
WifiP2pManager.ConnectionInfoListener |
requestConnectInfo() |
WifiP2pManager.GroupInfoListener |
requestGroupInfo() |
WifiP2pManager.PeerListListener |
requestPeers() |
WiFi P2P API还定义了一些广播的intent, 在WiFi P2P事件发生的时候会发送广播,比如当一个新的peer被发现或者设备的WiFi状态发生变化的时候. 我们可以注册接收这些intent来处理这些事件:
Intent |
Description |
WIFI_P2P_CONNECTION_CHANGED_ACTION |
当设备WiFi连接状态改变的时候广播. |
WIFI_P2P_PEERS_CHANGED_ACTION |
当我们调用discoverPeers()时候广播. 如果我们处理了这个intent, 那么可能会经常调用requestPeers()来获得peer的列表更新peer的list. |
WIFI_P2P_STATE_CHANGED_ACTION |
WiFi P2P启动或者关闭的时候广播. |
WIFI_P2P_ THIS_DEVICE_CHANGED_ACTION |
当一个设备的详细信息发生变化的时候会广播, 比如设备的名字. |
为WiFi P2P Intent创建一个Broadcast Receiver:
Broadcast receiver让我们可以接收Androidframework发出的广播, 这样我们的APP就可以响应我们感兴趣的事件了. 创建它的基础步骤是这样的:
1. 创建一个类, 继承自BroadcastReceiver类. 我们最常为其构造方法指定的参数是WifiP2pManager和WifiP2pManager.Channel. 这让broadcast receiver可以给activity发送更新, 就好像访问了WiFi硬件和通信通道一样.
2. 在broadcast receiver的onReceive()方法中检查感兴趣的intent. 比如如果broadcast receiver收到了一个WIFI_P2P_PEERS_CHANGED_ACTION intent, 我们就可以调用requestPeers()方法来得到当前发现的peer的列表.
下面的代码展示了如何创建一个典型的broadcast receiver. 它接收一个WifiP2pManager对象和一个activity作为参数, 并使用这俩类来处理感兴趣的intent:
/**
* A BroadcastReceiver that notifies of important Wi-Fi p2p events.
*/
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager mManager;
private Channel mChannel;
private MyWiFiActivity mActivity;
public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel,
MyWifiActivity activity) {
super();
this.mManager = manager;
this.mChannel = channel;
this.mActivity = activity;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();