Android中的WiFi P2P
Android中的WiFi P2P可以同意一定范围内的设备通过Wifi直接互连而不必通过热点或互联网。
使用WiFi P2P须要Android API Level >= 14才干够,并且不要忘记在Manifest文件里增加以下5个权限:
● android.permission.ACCESS_WIFI_STATE
● android.permission.CHANGE_WIFI_STATE
● android.permission.ACCESS_NETWORK_STATE
● android.permission.CHANGE_NETWORK_STATE
● android.permission.INTERNET (WiFi P2P并不须要连接互联网。可是由于要用到Java Socket,所以要加这个权限)
关于WiFi P2P的操作差点儿都靠WifiP2pManager来进行,所以假设你的程序要用到WiFi P2P功能,能够设置一个全局变量wifiP2pManager,然后在onCreate()生命函数中获取系统WifiP2pManager对象:
wifiP2pManager = (WifiP2pManager) getApplicationContext().getSystemService(Context.WIFI_P2P_SERVICE);
WifiP2pManager有例如以下方法能够非常方便的进行P2P操作:
方法 | 功能 |
---|---|
initialize() |
在使用WiFi P2P功能时必须先调用这种方法,用来通过WiFi P2P框架注冊我们的应用 |
connect() |
依据配置(WifiP2pConfig对象)与指定设备(WifiP2pDevice对象)进行P2P连接 |
cancelConnect() |
关闭某个P2P连接 |
requestConnectInfo() |
获取设备的连接信息 |
createGroup() |
以当前的设备为组长创建P2P小组 |
removeGroup() |
移除当前的P2P小组 |
requestGroupInfo() |
获取P2P小组的信息 |
discoverPeers() |
初始化peers发现操作 |
requestPeers() |
获取当前的peers列表(通过discoverPeers发现来的) |
每当WifiP2pManager运行某个P2P操作时。能够通过不同的监听器来检測这些操作的反馈结果,这些监听器的类型例如以下:
那么接下来就能够解说怎样使用WiFi P2P了。
一. 准备工作
准备阶段须要让我们的应用能够接受P2P信号,这就须要一个意图广播接收器。要创建一个符合我们要求的广播接收器须要准备以下3个要素:
(1) 一个意图广播接收器。用来接受意图广播。
(2) 通过WifiP2pManager的initialize()初始化操作来获取一个Channel对象,用于以后和WiFi P2P框架保持通信。
(3) 自己包装BroadcastReceiver类,实现一个接收器。
意图过滤器使用例如以下方法创建:
// 设置intent过滤器
intentFilter = new IntentFilter(); //一个全局的intentFilter对象
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); // WiFi P2P是否可用
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); // peers列表发生变化
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); // WiFi P2P连接发生变化
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); // WiFi P2P设备信息发生变化(比方更改了设备名)
Channel的获取方法:
channel = wifiP2pManager.initialize(getApplicationContext(), getMainLooper(), null); // channel是一个全局的Channel对象
意图广播接收器的创建须要通过继承BroadcastReceiver类来自己实现,以下给出了一段演示样例:
class MyBroadcastReceiver extends BroadcastReceiver {
// 使用WiFi P2P时。自定义的BroadcastReceiver的构造函数一定要包括以下这三个要素
private WifiP2pManager wifiP2pManager;
private Channel channel;
private Activity activity; public MyBroadcastReceiver(WifiP2pManager wifiP2pManager, Channel channel, Activity activity) {
this.wifiP2pManager = wifiP2pManager;
this.channel = channel;
this.activity = activity;
} // onReceiver对对应的intent进行处理
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
// WiFi P2P 能够使用
} else {
// WiFi P2P 不能够使用
}
} 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)) {
}
}
}
定义完了之后就能够再须要的地方实例化一个意图广播接收器对象了:
broadcastReceiver = new MyBroadcastReceiver(wifiP2pManager, channel, this);
那么三个要素都具备了之后就要向应用注冊我们的接收器,好让它能够開始工作:
registerReceiver(broadcastReceiver, intentFilter);
二. 启动peers发现
public void discoverPeers(View view) {
peerListListener = new WifiP2pManager.PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
peers.clear(); // peers是一个全局ArrayList对象。用于保存发现的peers的信息
peers.addAll(peerList.getDeviceList());
// 假设你有一个控件用来显示这些peers的信息,就能够再这里更新了
}
}; wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "discover peers!", Toast.LENGTH_SHORT);
} @Override
public void onFailure(int arg0) {
}
});
// discoverPeers是异步运行的,调用了之后会立马返回,可是发现的过程一直在进行。
// 直到发现了某个设备时就会通知你
}
当发现了设备之后就会触发WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION意图广播。你能够再之前自己包装的BroadcastReceiver类中增加对这一意图的处理:
else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
if (wifiP2pManager != null) {
wifiP2pManager.requestPeers(channel, peerListListener);
}
}
三. 与peers建立连接
public void connect() {
final WifiP2pDevice device = (WifiP2pDevice) peers.get(0); //从peers列表中获取发现来的第一个设备
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC; wifiP2pManager.connect(channel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// 连接成功
Toast.makeText(getApplicationContext(), "与设备" + device.deviceName + "连接成功", Toast.LENGTH_LONG).show();
} @Override
public void onFailure(int arg0) {
// 连接失败
Toast.makeText(getApplicationContext(), "与设备" + device.deviceName + "连接失败", Toast.LENGTH_LONG).show();
}
});
}
每当有P2P连接状态发生改变时,就会触发WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION意图广播,能够在之前你自己包装的BroadcastReceiver类中增加对这一意图的处理:
else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
if (wifiP2pManager == null)
return; NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected()) { // We are connected with the other device, request
// connection
// info to find group owner IP wifiP2pManager.requestConnectionInfo(channel, new WifiP2pManager.ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo info) {
// 这里能够查看变化后的网络信息 // 通过传递进来的WifiP2pInfo參数获取变化后的地址信息
InetAddress groupOwnerAddress = info.groupOwnerAddress;
// 通过协商,决定一个小组的组长
if (info.groupFormed && info.isGroupOwner) {
// 这里运行P2P小组组长的任务。
// 一般是创建一个服务线程来监听client的请求
} else if (info.groupFormed) {
// 这里运行普通组员的任务
// 一般是创建一个client向组长的server发送请求
}
}
});
}
}
Android中的WiFi P2P的更多相关文章
- Android 中的WiFi剖析
Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...
- 《安卓网络编程》之第六篇 Android中的WIFI和蓝牙
关于WIFI就不多介绍啦,直接来个段子吧. 问:“WiFi对人体有伤害么?” 答:“不清楚,反正没有WiFi我就浑身不舒服. 比较重要的一点就是WifiManager wm=(WifiManager ...
- android 中判断WiFi是否可用的可靠方法 ,android 是否联网
http://alex-yang-xiansoftware-com.iteye.com/blog/619841 在一些程序中,需要从网上下载数据,或者通过其他方式对网络产生流量,当wifi不可用时应该 ...
- 【移动开发】Android中WIFI开发总结(一)
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热 ...
- android开发之 Wifi的四个类
android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...
- 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选
本章主要内容: 介绍Wi-Fi P2P相关知识: 介绍Android中WifiP2pService.wpa_supplicant的相关代码. 7.1 概述 承接第6章介绍的WSC,本章将继续介绍Wi ...
- 【Android Developers Training】 77. 使用Wi-Fi P2P进行服务搜索
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android Wi-Fi Peer-to-Peer(Android的Wi-Fi P2P对等网络)
Wi-Fi peer-to-peer(P2P,对等网络),它同意具备对应硬件的Android 4.0(API level 14)或者更高版本号的设备能够直接通过wifi而不须要其他中间中转节点就能直接 ...
- android wifi P2P CONNECT, INVITE和JOIN流程选择
android wifi P2P CONNECT, INVITE和JOIN流程选择
随机推荐
- bzoj2819: Nim(博弈+树剖)
2819: Nim 题目:传送门 题解: 很久之前学博弈的时候看过的一道水题,其实算不上博弈吧... 直接套上一个裸的树剖啊,把路径上的点值全都xor(xor满足结合率所以就不管那么多随便搞啦) do ...
- [Plugin] JQuery.uploadify上传文件插件的使用详解For ASP.NET
URL:http://www.cnblogs.com/xiaopin/archive/2010/01/21/1653523.html 今天下午整理文件上传的例子,感觉收集到的例子都很不人性话,后来找到 ...
- c.vim的安装和使用
之前写了一些废话,今天写的稍微具体点. 在mac上给vim装个插件,,倒腾了半天 先要去找到c.vim.zip,自己百度下,官网就有的,我mac下下来,是直接解压的格式,而不是*.zip,也就是说不需 ...
- POJ 1654 乱搞题?
题意: 从一个点出发,8个方向,给出每一步的方向,求出走过的路径形成的多边形的面积. 思路: 先普及一下向量叉乘.. (摘自度娘) 也就是x1y2-x2y1. 那这不就好说了嘛. 一个经过原点的闭合多 ...
- Hadoop MapReduce编程 API入门系列之网页流量版本1(二十二)
不多说,直接上代码. 对流量原始日志进行流量统计,将不同省份的用户统计结果输出到不同文件. 代码 package zhouls.bigdata.myMapReduce.flowsum; import ...
- 关于用户禁用Cookie的解决办法和Session的图片验证码应用
当用户通过客户端浏览页面初始化了Session之后(如:添加购物车,用户登陆等),服务器会将这些session数据保存在:Windows保存在C:\WINDOWS\Temp的目录下,Linux则是保存 ...
- ORACLE 11g 导出数据
ORACLE 11g 导出 表的时候 不会导出空表 导出空表操作步骤 :(使用PLSQL) 1.打开SQL window 执行下面的 SQL Select 'alter table '||table_ ...
- Swift 中实现 Promise 模式
在异步编程中,除了竟态处理.资源利用以外,另外一个难点就是流程管理.在拥有匿名函数.闭包这些特性的编程语言中,我们通常可以使用回调函数来做一个异步任务完成或失败时的处理.但当我们的业务逻辑逐渐复杂时, ...
- sql_1
order by SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC; SELECT Company, OrderNumber ...
- Dynamics CRM Online 快速的debug 方法
这里的前提想大家了解一下. Dynamics 365 online的产品的session是30分钟 timeout. 如果你logout之后, session还是会储存在服务器端不会release. ...