Android 4.0引入了一项很重要的技术就是 WiFiDirect (WiFi直连) ,它可以让WiFi设备无需热点即可实现两个WiFi设备的P2P数据交换。使用最新的Android 4.0 SDK,最低API Level 14才支持此项技术,在SDK的例子中我们可以看到很多界面用到了Android 3.0时代的Fragment容器。

首先我们需要实现android.net.wifi.p2p.WifiP2pManager.ChannelListener 接口来获取支持WiFi直连的Android设备。

public class WiFiDirectActivity extends Activityimplements ChannelListener, DeviceActionListener {

public static final String TAG = "wifidirectdemo";
private WifiP2pManager manager;
private boolean isWifiP2pEnabled = false;
private boolean retryChannel = false;

private final IntentFilter intentFilter = new IntentFilter();
private Channel channel;
private BroadcastReceiver receiver = null;

public void setIsWifiP2pEnabled(boolean isWifiP2pEnabled) { //设置一个标记是否启用WiFi直连
this.isWifiP2pEnabled = isWifiP2pEnabled;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//注册所需要处理的action,比如WiFi连接、状态改变等。

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);

manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
channel = manager.initialize(this, getMainLooper(), null); //实例化WifiP2pManager对象
}

@Override
public void onResume() {
super.onResume();
receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
registerReceiver(receiver, intentFilter);
}

@Override
public void onPause() {
super.onPause();
unregisterReceiver(receiver);
}

public void resetData() {
DeviceListFragment fragmentList = (DeviceListFragment) getFragmentManager()
.findFragmentById(R.id.frag_list);
DeviceDetailFragment fragmentDetails = (DeviceDetailFragment) getFragmentManager()
.findFragmentById(R.id.frag_detail);
if (fragmentList != null) {
fragmentList.clearPeers();
}
if (fragmentDetails != null) {
fragmentDetails.resetViews();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_items, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.atn_direct_enable:
if (manager != null && channel != null) {

startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
} else {
Log.e(TAG, "channel or manager is null");
}
return true;

case R.id.atn_direct_discover:
if (!isWifiP2pEnabled) {
Toast.makeText(WiFiDirectActivity.this, R.string.p2p_off_warning,
Toast.LENGTH_SHORT).show();
return true;
}
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
.findFragmentById(R.id.frag_list);
fragment.onInitiateDiscovery();
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {

@Override
public void onSuccess() {
Toast.makeText(WiFiDirectActivity.this, "Discovery Initiated",
Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(int reasonCode) {
Toast.makeText(WiFiDirectActivity.this, "Discovery Failed : " + reasonCode,
Toast.LENGTH_SHORT).show();
}
});
return true;
default:
return super.onOptionsItemSelected(item);
}
}

@Override
public void showDetails(WifiP2pDevice device) {
DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
.findFragmentById(R.id.frag_detail);
fragment.showDetails(device);

}

@Override
public void connect(WifiP2pConfig config) {
manager.connect(channel, config, new ActionListener() {

@Override
public void onSuccess() {
// WiFiDirectBroadcastReceiver will notify us. Ignore for now.
}

@Override
public void onFailure(int reason) {
Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",
Toast.LENGTH_SHORT).show();
}
});
}

@Override
public void disconnect() {
final DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
.findFragmentById(R.id.frag_detail);
fragment.resetViews();
manager.removeGroup(channel, new ActionListener() {

@Override
public void onFailure(int reasonCode) {
Log.d(TAG, "Disconnect failed. Reason :" + reasonCode);

}

@Override
public void onSuccess() {
fragment.getView().setVisibility(View.GONE);
}

});
}

@Override
public void onChannelDisconnected() {
// we will try once more
if (manager != null && !retryChannel) {
Toast.makeText(this, "Channel lost. Trying again", Toast.LENGTH_LONG).show();
resetData();
retryChannel = true;
manager.initialize(this, getMainLooper(), this);
} else {
Toast.makeText(this,
"Severe! Channel is probably lost premanently. Try Disable/Re-Enable P2P.",
Toast.LENGTH_LONG).show();
}
}

@Override
public void cancelDisconnect() {

if (manager != null) {
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
.findFragmentById(R.id.frag_list);
if (fragment.getDevice() == null
|| fragment.getDevice().status == WifiP2pDevice.CONNECTED) {
disconnect();
} else if (fragment.getDevice().status == WifiP2pDevice.AVAILABLE
|| fragment.getDevice().status == WifiP2pDevice.INVITED) {

manager.cancelConnect(channel, new ActionListener() {

@Override
public void onSuccess() {
Toast.makeText(WiFiDirectActivity.this, "Aborting connection",
Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(int reasonCode) {
Toast.makeText(WiFiDirectActivity.this,
"Connect abort request failed. Reason Code: " + reasonCode,
Toast.LENGTH_SHORT).show();
}
});
}
}

}
}

转载于:https://www.cnblogs.com/anakin/archive/2012/02/01/2335067.html

Android 4.0新增WiFiDirect功能相关推荐

  1. android 灰阶模式,加强系统封闭性,安卓9.0新增几大功能,网友:已经赶上苹果iOS了...

    原标题:加强系统封闭性,安卓9.0新增几大功能,网友:已经赶上苹果iOS了 智能手机操纵系统经过历代淘沙,最终留下两大阵营:谷歌的安卓阵营和苹果的iOS阵营.一款手机的操作系统的好坏取决于这款手机的整 ...

  2. Android多媒体二:Android 5.0新增的屏幕捕捉

    Android多媒体二:Android 5.0新增的屏幕捕捉 Android 5.0新增了MediaProjectionManager管理器,该管理器可以非常方便地实现屏幕捕捉功能. 使用MediaP ...

  3. android 9.0室内定位方案,Android 9.0四大隐藏功能,让你的安卓手机更实用

    全新的Android 9.0系统已经于8月初推送了正式版,谷歌Pixel手机以及Essential Phone也第一时间获得了更新.此外,HTC.索尼以及部分国产手机品牌也在进行适配工作.预计年底之前 ...

  4. Android 4.0新增Space及GridLayout初谈

    在Android中,使用的最多的布局是LinearLayout了,它可以让布局界面中的子控件以常见的方式比如水平或者垂直方向对齐.在使用LinearLayout时,开发者应该会记得,会经常遇到复杂的布 ...

  5. android 5.0 ios 8,iOS 8与Android 5.0大比拼:功能相同 体验不同

    过去半年,Android和iOS的移动大战已经发生了一些有趣的变化.过去,两款移动操作系统的差别主要体现在功能和精致方面.传统上,Android以更多功能和更高的可定制性见长,iOS则更为精致. 但是 ...

  6. android 5.0新增 ui 控件,android3.0新增ui控件示例说明.doc

    android3.0新增ui控件示例说明 Android3.0新增UI控件 AdapterViewAnimator控件 AdapterViewAnimator(堆View),已知子类有AdapterV ...

  7. android有什么作用,Android 7.0有什么功能 Android N完整功能参数介绍

    类型:系统工具大小:1000M语言:中文 评分:10.0 标签: 立即下载 Android 7.0是安卓最近正在更新的一个版本,而其中也是有着很多的特性,在Android N的逐渐的曝光中,我们也是可 ...

  8. Android 6.0 指纹识别功能学习(一)----阿冬专栏!!!

    转载自:http://www.cnblogs.com/changyuet/p/5535082.html 由于毕设需要设计增强的身份认证(生物特征认证方式),所以需要学习指纹识别相关的android6. ...

  9. android 5.0 桌面,桌面功能更炫 Android 5.0效果图曝光

    中关村在线消息:5月15日的谷歌I/O大会并没有出现Android 5.0系统的身影,这不禁让人对这款"酸橙派"系统更心生遐想. 近日,由国外设计师Jinesh Shah渲染的全新 ...

最新文章

  1. Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
  2. 阿里云容器服务全面升级为 ACK Anywhere,让云的边界拓展至企业需要的每个场景
  3. Gartner:2016年全球IoT安全开支将达到3.48亿美元
  4. php验证旧密码,PHP验证数据库密码问题
  5. Linux代理服务器与防火墙安装与应用
  6. VRRP在生产环境中的应用
  7. 二级c语言统计小于n素数的个数,关于求N以内素数的一点小问题(N小于一亿)...
  8. Spring Cloud与微服务学习总结(9)——Spring Cloud面试题汇总
  9. android版本大于26,装包的API等级(targetSdkVersion)必须等于或高于26,请从新打包上传...
  10. 数值计算之 梯度向量和梯度矩阵,雅可比矩阵,海森矩阵
  11. 物联网开发笔记(29)- 使用Micropython开发ESP32开发板之控制240x240的oled屏幕显示动态图片GIF(ST7789芯片)
  12. Vim,人类史上最好用的文本编辑器!从此以后你就是一个善良的极客!
  13. 摄像头的像素与分辨率之间的关系
  14. 【转】增强型、耗尽型MOS
  15. 输入框:请输入关键字 小功能
  16. UE4中使用第三方库Ⅱ
  17. 关于gif进度条的问题
  18. 联想昭阳E47A无线网卡指示灯不亮,搜不到无线信号,解决办法
  19. 骑鹤下江南 mysql 安装及配置
  20. python 理论基础知识试题_Python理论基础知识复习

热门文章

  1. Java volatile关键字原理解剖
  2. php中的冒号应用,php中双冒号的应用
  3. keras冻结_[开发技巧]·keras如何冻结网络层
  4. java程序设计_JAVA基础程序设计之方法
  5. 【转】自然语言系列学习之表示学习与知识获取(五)融合文本和知识,利用cnn方法进行关系抽取
  6. JBPM学习笔记(1)
  7. 一文学会设置 Jupyter 主题与目录
  8. 别人的20几岁 vs 互联网人的20几岁
  9. Python入门,从19个语法开始!
  10. CVPR 2019审稿排名第一满分论文:让机器人也能「问路」的视觉语言导航新方法...