Android Wifi Direct 安卓手机间wifi直连
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直连相关推荐
- pc android wifi热点,安卓手机做wifi热点让笔记本上网的方法
现在的安卓2.2系统以上的手机都可以将手机的无线上网信号共享出来,然后笔记本电脑或平板电脑在没有网络的情况下,可以通过手机3G网络,畅游无线网络. 1.打开手机应用列表 2.进入设置,无线与网络 3. ...
- android手机设置固定dns,(图文)安卓手机修改WiFi DNS设置的方法
如果你的家里WiFi之前修改过DNS,那么我们使用手机连接网络的时候可能会出现可以连接WiFi,但是不能上网的状况,对于这种状况我们要如何解决呢?下面云狐网分享一下安卓手机修改WiFi DNS设置的方 ...
- 笔记本上建立WIFI供安卓手机使用
今天较大家用两种方法在笔记本上建立WIFI供安卓手机使用一,用是用软件,connetify这个软件你可以去下载,虽然是英文,但是很容易使用. 二,用win7建立无线局域网,可以共享上网可以局域网游戏. ...
- android 数据传递工具,AnyTrans for Android for Mac(安卓手机数据传输工具)
原标题:AnyTrans for Android for Mac(安卓手机数据传输工具) AnyTrans for Android for Mac是一款好用的安卓手机数据传输工具,全面管理您的iPho ...
- direct wifi 芯片_介绍一款支持WiFi Direct的SPI接口WiFi模块
从定义上来看,WiFi Direct是一个标准,WiFi Direct标准是指允许无线网络中的设备无需通过无线路由器即可相互连接.与蓝牙技术类似,这种标准允许无线设备以点对点形式互连,不过在传输速度与 ...
- Appium 移动端自动化 - Android SDK连接安卓手机,adb连接一加8手机USB调试实例演示,连接一加8手机不显示USB调试选项问题排查
Android SDK 连接安卓手机过程演示 第一章:一加8手机连接过程 ① 启用开发者模式 ③ 开发者选项启用 USB 调试 ③ 手机连接 USB 调试 ④ 手机连接不显示 USB 调试选项问题排查 ...
- Windows Win7建立wifi热点,手机共享WIFI上网
Win7建立wifi热点,手机共享wifi上网 by:授客 QQ:1033553122 1.以管理员身份运行命令提示符:快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡:运行命令:n ...
- android wifi 静态地址设置_安卓手机连接wifi故障的6种常见解决方法
现如今,人们已经离不开wifi的使用了,有了wifi,流量不够用什么的都是浮云.如果手机连接wifi出了问题怎么办?不要抓狂不要沮丧,六招让你手机wifi满血复活! 第一招:关闭并重启WIFI连接 用 ...
- android wifi无法连接手机号码,安卓手机无法使用WiFi连接ApowerMirror解决方法
有部分安卓用户反馈,无法使用WiFi连接ApowerMirror,根据大家的问题,为大家做了以下教程参考: 一.常规检查 1.将手机及电脑连接到同一个WiFi中. 2.重启手机.电脑以及电脑端Apow ...
最新文章
- [YTU]_2575( 交通工具信息)
- 【收藏】spark中map与mapPartitions区别
- PetaPoco 使用总结(二)
- 简明Vim练级攻略(转载)
- border,padding,margin盒模型理解
- SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收
- Cisco 2960交换机配置
- iOS UI控件(2) UITextView
- 最新的SAS SID 2023可用至2023年1月SAS 9.4 SID续订更新sas sid 2022服务器通用版server
- EXCEL:如何设置某一列不能修改
- 数据类型——字符串(str)
- java闰年_编写java程序判断闰年。
- sin的傅里叶变换公式_正弦信号傅里叶变换
- nginx获取第三方ngixn中请求头信息以及判断是否有参数的跳转地址
- 电脑蓝屏按哪三个键恢复?怎么修复蓝屏问题
- python正态分布拟合_用python拟合正态分布(已开源)
- 饥饿游戏3:嘲笑鸟(下)[The Hunger Games: Mockingjay - Part 2]
- 渗透测试-红队从资产收集到打点
- 工业相机及镜头的选型
- Struts2-初学小结