《Android NFC开发实战详解》——6.1节关于NFC P2P模式
本节书摘来自异步社区《Android NFC开发实战详解》一书中的第6章,第6.1节关于NFC P2P模式,作者 赵波,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.1 关于NFC P2P模式
Android NFC开发实战详解
P2P模式是NFC 3种模式之一(其他两种为读写模式、卡模拟模式),主要完成在两个NFC设备之间数据的传递,传输的一方同时也可以是接收对方的数据。P2P模式在Android2.3.3+(API 10)中开始加入,其采用的是Foreground NDEF Push的方法,在Android4.0 +(API 14)后又重新提供了一套新的API函数(又称为Beam)。对于上述两种方式,在本章中为大家进行详细介绍。
注意,Android NFC P2P功能是在API 10以后版本中才加入的,这与Android NFC读写模式开发稍有不同(其在API 9中开始加入)。因此,在Android API 9中,可以进行NFC读写Tag的应用开发,但P2P功能的开发必须在API 10以上版本才支持,这点在开发中需要注意。另外,如上所述,在API 10以上系统版本开发P2P功能时,Android系统提供了两套API方法。在API 10+中提供的是Foreground NDEF Push的API方法—enableForegroundNdefPush(),在API 14+提供的是setNdefPushMessageCallback()方法和setNdefPushMessage()方法,这点在开发中也需要注意。
6.1.1 Beam使用的条件
NFC P2P模式是指两个NFC设备在靠近彼此时完成数据的交换。在Android API 14+后,将两个Android设备之间通过P2P传输数据称为Beam,在两个设备之间要完成Beam功能,必须具备以下几个条件:
(1)必须打开手机的Android Beam功能,具体在Android的设置中,如图6-1所示;
(2)要实现Beam NDEF消息的应用程序(发送端)必须在前台,不能是后台服务,不能处在锁屏状态;
(3)要接收Beam消息的手机(接收端),其屏幕不能处在锁屏状态;
(4)要在Android手机设备中完成Beam功能,其手机系统版本必须是API 14+(API 10+也可以实现P2P功能,但一般习惯在API 14+后新提供的API实现的P2P功能称为Beam功能);
(5)两个手机在进行彼此靠近实现Beam功能时,会弹出图6-2所示的画面,显示“Touch to Beam(触摸发射)”,此时,用户应该触碰需要Beam NDEF消息的设备,即发射设备(另一设备即为接收Beam消息)。注意,该过程仅在API 14+以上系统才具备。
![903604eb95f07a1ccd71396dc74b28c4ed11487c](https://yqfile.alicdn.com/903604eb95f07a1ccd71396dc74b28c4ed11487c.png)
6.1.2 Beam Enable的判断
在第4章中,本书介绍了Android APP开发中如何判断系统上是否支持NFC功能以及NFC功能是否开启。这里需要特别注意,系统在支持NFC功能及NFC功能开启的情况下并不能说明系统Beam功能也是OK的,在API 14+后Android系统中加入了isNdefPushEnabled( )方法,大家可以通过该函数判别Beam功能是否Enable,具体代码如下:
1. /** 2. * NFC Function Check 3. * By skyseraph 2013-2 4. */ 5. private NfcAdapter mNfcAdapter = null; 6. private boolean checkNFCFunction() 8. // TODO Auto-generated method stub 9. mNfcAdapter = NfcAdapter.getDefaultAdapter(this); // getting the default NFC adapter. 10. if (mNfcAdapter == null) 11. { 12. Toast.makeText(getApplicationContext(), "NFC apdater is not Available!", Toast.LENGTH_SHORT).show(); 13. // add what your want in here 15. return false; 16. } else 17. { 18. if (!mNfcAdapter.isEnabled()) 19. { 20. Toast.makeText(getApplicationContext(), "NFC is not Enabled!", Toast.LENGTH_SHORT).show(); 21. // add what yout want in here 23. Intent setnfc = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 24. // Intent setnfc = new Intent(Settings.ACTION_NFC_SETTINGS); 25. startActivity(setnfc); 26. return false; 27. } else if (!mNfcAdapter.isNdefPushEnabled()) 28. { 29. Toast.makeText(getApplicationContext(), "NFC Beam is not Enabled!", Toast.LENGTH_SHORT).show(); 30. // add what yout want in here 32. Intent setnfc = new Intent(Settings.ACTION_NFCSHARING_SETTINGS); 33. startActivity(setnfc); 34. return false; 35. } 36. else 37. { 38. return true 39. } 40. } 41. }
第9行通过NfcAdapter.getDefaultAdapter(this)获取NFC适配器,通过其判断当前设备是否支持NFC功能。
第18行通过mNfcAdapter.isEnabled()来判断当前设备NFC功能是否开启。
第27行通过mNfcAdapter.isNdefPushEnabled()来判断当前设备Beam功能是否可用。
注意,在上述提到过,通过isNdefPushEnabled函数判断Beam功能是否Enable。当返回为Ture时,NFC和Beam功能都是Enable的;当返回为False时,此时Beam功能是Disable的,但只要NFC功能是Enable的,Android设备仍能接收Beam消息只是不能Beam NDEF消息。
更进一步地说,在两个Android NFC设备靠近时,如果发送设备上(BNM)当前打开的应用程序并没有实现Android Beam功能,系统也会自动发送一条默认的NDEF消息给接收端(RBM)。该NDEF消息为发送端当前应用程序的URI,接收端接收到这条URI时,若系统版本是API 10~API 13,则系统会提示用户该应用程序未打开;若系统版本是API 14+时,此时系统会自动跳转到Google Paly中该APP的下载链接页供用户下载。有了这个功能,用户之间可以很轻易的实现APP的分享。假设手机中有一个非常好玩的游戏APP,若要将此APP分享给好友,只要打开该游戏然后触碰一下好友的手机,该手机马上会打开对应的APP(当该APP已经安装的情形下)或者跳转到Google Play中该APP的下载链接页,很方便的实现分享。
另还有一点需要注意,如果在前台的Activity中启用了Android Beam,那么标准的Intent调度系统就会被禁用。但是,如果该Activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟Intent过滤器匹配的NFC标签。
《Android NFC开发实战详解》——导读 本节书摘来自异步社区《Android NFC开发实战详解》一书中的目录,作者 赵波,更多章节内容可以访问云栖社区“异步社区”公众号查看
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/nsd-wifi-direct.html 本阶段的第一节课 Using Network Service Discovery 展示了如何搜索本地网络服务。
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/wifi-direct.html#permissions Wi-Fi peer-to-peer (P2P) APIs可以使程序与附近的设备进行直接通讯,Android的Wi-Fi P2P框架由Wi-Fi Direct™提供技术支持。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Android锁屏或灭屏状态下,高速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- 《深入理解Android内核设计思想》
- Android 异常 android.os.NetworkOnMainThreadException
- Android studio 2.0--android增量更新的那些事
- Android记录24-WebView实现白天/夜间阅读模式
- Android SDK源码阅读:时序图思维导图式的记忆模式
- 《Android 源码设计模式解析与实战》——第2章,第2.2节单例模式的定义
- 《Android 源码设计模式解析与实战》——第2章,第2.6节单例模式的其他实现方式
- 《Android游戏开发详解》——第3章,第3.2节getter和setter
- Android官方终于支持 Navigation Drawer(导航抽屉)模式
- android开发:Android 中自定义属性(attr.xml,TypedArray)的使用
- android开发:Android 中自定义View的应用
- Android应用开发相关下载资源(2014/12/14更新)
- Android 串口通信基于licheedev和android-serialport两种方案实现附Demo
- Android中定时执行任务的3种实现方法
- 如何生成Android签名证书、安卓签名获取工具获取APP签名报错:NameNotFoundException: Signs is null的问题
- Android Studio升级或更新项目,经常造访的“Could not find com.android.tools.build :gradle: x.x.x”的原因分析
- Android的分屏模式开发注意事项
- Android N分屏模式Activity生命周期的变化
- Android广播机制:Broadcast
- Android源代码装饰模式---ContextWrapper
- android 细节之An internal error occurred during: "Launching New_configuration".
- 【Android开发经验】android:windowSoftInputMode属性具体解释
- Android Studio项目导入aar包报错
- 说说Android的MVP模式
- Win10下不能识别Android的MTP模式