Wi-Fi Direct™的API允许应用程序不通过网络或热点,直接与周围的设备进行连接。应用程序可以迅速地查找附近的设备,交换信息。并且与蓝牙相比,Wi-Fi Direct的通讯范围更大。

通过Wi-Fi Direct查找附近的设备,并与之连接一般包括如下几个步骤:

  • 设置应用程序权限
  • 创建一个广播接收器和对等网络管理器 
  • 初始化对等点的搜索
  • 获取对等点列表
  • 连接一个对等点


一、设置应用程序权限


使用Wi-Fi Direct,需要向你的清单文件添加 CHANGE_WIFI_STATE,ACCESS_WIFI_STATE 和INTERNET 权限。Wi-Fi Direct不需要因特网连接,但需要使用标准Java套接字,而套接字需要INTERNET 权限,因此,你需要有以下的权限才可以使用Wi-Fi Direct。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android.nsdchat"...<uses-permissionandroid:required="true"android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permissionandroid:required="true"android:name="android.permission.CHANGE_WIFI_STATE"/><uses-permissionandroid:required="true"android:name="android.permission.INTERNET"/>...

注:

android.permission.ACCESS_WIFI_STATE       允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)
android.permission.CHANGE_WIFI_STATE      允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)
android.permission.INTERNET                           当需要访问网络的时候,需要在AndroidManifest.xml里面添加访问网络的权限

二、创建一个广播接收器和对等网络管理器

使用Wi-Fi Direct,你需要监听广播意图(Intents)来获知某个特定事件的发生。在你的应用程序中,初始化一个 IntentFilter,并让它监听以下动作:

WIFI_P2P_STATE_CHANGED_ACTION

  • * 表明Wi-Fi对等网络(P2P)是否已经启用

WIFI_P2P_PEERS_CHANGED_ACTION

  • * 表明可用的对等点的列表发生了改变

WIFI_P2P_CONNECTION_CHANGED_ACTION

  • * 表示Wi-Fi对等网络的连接状态发生了改变

WIFI_P2P_THIS_DEVICE_CHANGED_ACTION

  • * 表示该设备的配置信息发生了改变
private final IntentFilter intentFilter = new IntentFilter();
...
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//表示Wi-Fi对等网络状态发生了改变intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);//表示可用的对等点的列表发生了改变intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);//表示Wi-Fi对等网络的连接状态发生了改变intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);//设备配置信息发生了改变intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);...
}

在 onCreate() 方法的最后,获得了 WifiP2pManager 的一个实例,并调用了他的 initialize() 方法。这个方法返回一个 WifiP2pManager.Channel 对象。稍后会用它把你的应用程序连接到Wi-Fi Direct框架中。

@OverrideChannel mChannel;public void onCreate(Bundle savedInstanceState) {....mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);mChannel = mManager.initialize(this, getMainLooper(), null);
}

现在,创建一个新的 BroadcastReceiver 类,用来监听系统的Wi-Fi P2P状态的改变。在 onReceive() 方法中,添加一个条件来处理上面列出的各种P2P状态的变更。

@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {//确定Wi-Fi Direct模式是否已经启用,并提醒Activity。int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {activity.setIsWifiP2pEnabled(true);} else {activity.setIsWifiP2pEnabled(false);}} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {//对等点列表已经改变!我们可能需要对此做出处理。} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {//连接状态已经改变!我们可能需要对此做出处理。} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {DeviceListFragment fragment = (DeviceListFragment) activity.getFragmentManager().findFragmentById(R.id.frag_list);fragment.updateThisDevice((WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));}}

最后,添加代码,在主活动激活时,注册意图过滤器(Intent Filter)和广播接收器;在主活动暂停时把它们注销。最好在 onResume() 和 onPause() 方法中完成该操作。

/* 注册一个与意图(Intent)值匹配的广播接收器* /@Overridepublic void onResume() {super.onResume();receiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);registerReceiver(receiver, intentFilter);}@Overridepublic void onPause() {super.onPause();unregisterReceiver(receiver);}

三、初始化对等点的搜索

使用Wi-Fi Direct搜索附近的设备,需要调用 discoverPeers()方法。其参数如下:

WifiP2pManager.Channel 是在你初始化对等网络的mManager时收到的。

WifiP2pManager.ActionListener 的一个实例,实现了系统在查找成功或失败时会调用的方法。

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {@Overridepublic void onSuccess() {//查找初始化成功时的处理写在这里。//实际上并没有发现任何服务,所以该方法可以置空。//对等点搜索的代码在onReceive方法中,详见下文。}@Overridepublic void onFailure(int reasonCode) {//查找初始化失败时的处理写在这里。//警告用户出错了。}
});

此处只初始化了对等点的搜索。 discoverPeers() 方法启动了搜索线程,并立刻返回。系统通过调用给定的动作监听器的方法来进行初始化,并会在成功初始化对等点进程时通知你。同时,搜索也会持续进行,直到一个连接被初始化,或者一个P2P组形成。

四、获取对等点列表

获取对等点的列表并进行处理,首先实现 WifiP2pManager.PeerListListener 接口,它提供了Wi-Fi Direct检测到的对等点信息。参见下面的代码片段。

private List peers = new ArrayList();...private PeerListListener peerListListener = new PeerListListener() {@Overridepublic void onPeersAvailable(WifiP2pDeviceList peerList) {//旧的不去,新的不来peers.clear();peers.addAll(peerList.getDeviceList());//如果AdapterView可以处理该数据,则把变更通知它。比如,如果你有可用对等点的ListView,那就发起一次更新。((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();if (peers.size() == 0) {Log.d(WiFiDirectActivity.TAG, "No devices found");return;}}}

现在,修改你的广播接收器的 onReceive() 方法,以便在收到一个带有 WIFI_P2P_PEERS_CHANGED_ACTION 动作的意图(Intent)时调用 requestPeers()方法。你得想办法把这个监听器传给接收器。其中一个方法是,将它作为一个参数传递给广播接收器的构造函数。

public void onReceive(Context context, Intent intent) {...else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {//从Wi-Fi P2P管理器中请求可用的对等点。//这是个异步的调用,//并且,调用行为是通过PeerListListener.onPeersAvailable()上的一个回调函数来通知的。if (mManager != null) {mManager.requestPeers(mChannel, peerListener);}Log.d(WiFiDirectActivity.TAG, "P2P peers changed");}...
}

至此,带有 WIFI_P2P_PEERS_CHANGED_ACTION 动作的意图(Intent)将会发起一个更新对等点列表的请求。

五、连接一个对等点

为了连接一个对等点,需要先创建一个新的 WifiP2pConfig 对象,然后从代表你想连接的设备的 WifiP2pDevice 中拷贝数据进去。再调用 connect() 方法。

@Overridepublic void connect() {//使用在网络上找到的第一个设备。WifiP2pDevice device = peers.get(0);WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = device.deviceAddress;config.wps.setup = WpsInfo.PBC;mManager.connect(mChannel, config, new ActionListener() {@Overridepublic void onSuccess() {// WiFiDirectBroadcastReceiver将会通知我们。现在可以先忽略。}@Overridepublic void onFailure(int reason) {Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",Toast.LENGTH_SHORT).show();}});}

在这个代码片段中实现的 WifiP2pManager.ActionListener 只会在初始化成功或失败时通知你。要监听连接状态的变更,需要实现 WifiP2pManager.ConnectionInfoListener 接口。其回调函数 onConnectionInfoAvailable()将会在连接状态改变时通知你。对于多个设备连接一个设备的情况(比如,多于3个玩家的游戏,或者聊天软件),其中一个设备将会被指定为“群主”。

@Overridepublic void onConnectionInfoAvailable(final WifiP2pInfo info) {// InetAddress在WifiP2pInfo结构体中。InetAddress groupOwnerAddress = info.groupOwnerAddress.getHostAddress());//组群协商后,就可以确定群主。if (info.groupFormed && info.isGroupOwner) {//针对群主做某些任务。//一种常用的做法是,创建一个服务器线程并接收连接请求。} else if (info.groupFormed) {//其他设备都作为客户端。在这种情况下,你会希望创建一个客户端线程来连接群主。}}

现在回到广播接收器的 onReceive() 方法中,修改监听 WIFI_P2P_CONNECTION_CHANGED_ACTION 意图(Intent)的部分。收到该意图(Intent)时,调用 requestConnectionInfo() 。这是一个异步的调用,所以结果会传给作为参数的连接信息监听器。

...} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {if (mManager == null) {return;}NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);if (networkInfo.isConnected()) {//我们连上了其他的设备,请求连接信息,以找到群主的IP。mManager.requestConnectionInfo(mChannel, connectionListener);}...


Android Wifi Direct 安卓手机间wifi直连相关推荐

  1. pc android wifi热点,安卓手机做wifi热点让笔记本上网的方法

    现在的安卓2.2系统以上的手机都可以将手机的无线上网信号共享出来,然后笔记本电脑或平板电脑在没有网络的情况下,可以通过手机3G网络,畅游无线网络. 1.打开手机应用列表 2.进入设置,无线与网络 3. ...

  2. android手机设置固定dns,(图文)安卓手机修改WiFi DNS设置的方法

    如果你的家里WiFi之前修改过DNS,那么我们使用手机连接网络的时候可能会出现可以连接WiFi,但是不能上网的状况,对于这种状况我们要如何解决呢?下面云狐网分享一下安卓手机修改WiFi DNS设置的方 ...

  3. 笔记本上建立WIFI供安卓手机使用

    今天较大家用两种方法在笔记本上建立WIFI供安卓手机使用一,用是用软件,connetify这个软件你可以去下载,虽然是英文,但是很容易使用. 二,用win7建立无线局域网,可以共享上网可以局域网游戏. ...

  4. android 数据传递工具,AnyTrans for Android for Mac(安卓手机数据传输工具)

    原标题:AnyTrans for Android for Mac(安卓手机数据传输工具) AnyTrans for Android for Mac是一款好用的安卓手机数据传输工具,全面管理您的iPho ...

  5. direct wifi 芯片_介绍一款支持WiFi Direct的SPI接口WiFi模块

    从定义上来看,WiFi Direct是一个标准,WiFi Direct标准是指允许无线网络中的设备无需通过无线路由器即可相互连接.与蓝牙技术类似,这种标准允许无线设备以点对点形式互连,不过在传输速度与 ...

  6. Appium 移动端自动化 - Android SDK连接安卓手机,adb连接一加8手机USB调试实例演示,连接一加8手机不显示USB调试选项问题排查

    Android SDK 连接安卓手机过程演示 第一章:一加8手机连接过程 ① 启用开发者模式 ③ 开发者选项启用 USB 调试 ③ 手机连接 USB 调试 ④ 手机连接不显示 USB 调试选项问题排查 ...

  7. Windows Win7建立wifi热点,手机共享WIFI上网

    Win7建立wifi热点,手机共享wifi上网 by:授客 QQ:1033553122 1.以管理员身份运行命令提示符:快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡:运行命令:n ...

  8. android wifi 静态地址设置_安卓手机连接wifi故障的6种常见解决方法

    现如今,人们已经离不开wifi的使用了,有了wifi,流量不够用什么的都是浮云.如果手机连接wifi出了问题怎么办?不要抓狂不要沮丧,六招让你手机wifi满血复活! 第一招:关闭并重启WIFI连接 用 ...

  9. android wifi无法连接手机号码,安卓手机无法使用WiFi连接ApowerMirror解决方法

    有部分安卓用户反馈,无法使用WiFi连接ApowerMirror,根据大家的问题,为大家做了以下教程参考: 一.常规检查 1.将手机及电脑连接到同一个WiFi中. 2.重启手机.电脑以及电脑端Apow ...

最新文章

  1. [YTU]_2575( 交通工具信息)
  2. 【收藏】spark中map与mapPartitions区别
  3. PetaPoco 使用总结(二)
  4. 简明Vim练级攻略(转载)
  5. border,padding,margin盒模型理解
  6. SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收
  7. Cisco 2960交换机配置
  8. iOS UI控件(2) UITextView
  9. 最新的SAS SID 2023可用至2023年1月SAS 9.4 SID续订更新sas sid 2022服务器通用版server
  10. EXCEL:如何设置某一列不能修改
  11. 数据类型——字符串(str)
  12. java闰年_编写java程序判断闰年。
  13. sin的傅里叶变换公式_正弦信号傅里叶变换
  14. nginx获取第三方ngixn中请求头信息以及判断是否有参数的跳转地址
  15. 电脑蓝屏按哪三个键恢复?怎么修复蓝屏问题
  16. python正态分布拟合_用python拟合正态分布(已开源)
  17. 饥饿游戏3:嘲笑鸟(下)[The Hunger Games: Mockingjay - Part 2]
  18. 渗透测试-红队从资产收集到打点
  19. 工业相机及镜头的选型
  20. Struts2-初学小结

热门文章

  1. chrome 应用程序无法启动,因为应用程序的并行配置不正确, 该怎么办呢?
  2. 设计模式之十生成器模式
  3. 一则故事让你轻松了解保险的实质
  4. python爬虫进阶-大众点评店铺信息(字体反爬-静态映射)
  5. 2023年软件设计师备考经验(附个人整理资料 全)
  6. python之基础训练题
  7. 通过bat批处理修改代理服务器设置及主页
  8. WAR3 澄海 恶魔气息 技能分析
  9. 如何使一台电脑用网线连接到另一台电脑上上网
  10. 0基础如何入门软件测试?10分钟从测试9个阶段带你快速入门【建议细品】