《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

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()
7.  {
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
14.    
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
22.     
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
31.    
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标签。

相关文章
|
8月前
|
Android开发
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
68 0
|
8月前
|
XML 前端开发 测试技术
Android基础知识:解释Android的MVC和MVP模式。
Android基础知识:解释Android的MVC和MVP模式。
75 0
|
8月前
|
XML Java Android开发
Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)
Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)
239 0
|
5月前
|
设计模式 Android开发 Kotlin
Android经典实战之Kotlin委托模式和by关键字
本文介绍了Kotlin中`by`关键字在类及属性委托中的运用,通过实例展示了如何利用类委托简化接口实现,以及如何借助标准与自定义属性委托管理属性的读写操作。通过`by`关键字的支持,Kotlin使得委托模式的实现更为直观且高效。
103 4
|
6月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
160 4
|
6月前
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
209 2
|
8月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
8月前
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
|
8月前
|
传感器 小程序 Java
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码 智慧校园即智慧化的校园,也指按智慧化标准进行的校园建设,按标准《智慧校园总体框架》中对智慧校园的标准定义是:物理空间和信息空间的有机衔接,使任何人、任何时间、任何地点都能便捷的获取资源和服务。
83 1
|
8月前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
106 0