文章目录

  • 前言
  • NFC 工作模式
  • 准备工作
  • 简单实例

前言

NFC 是 Near Field Communication 缩写,即近距离无线通讯技术。可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。

NFC 工作模式

NFC 工作模式主要有三种工作模式,分别是卡模式(Card emulation)、点对点模式(P2P mode)和读卡器模式(Reader/writer mode)。

  • 读卡器模式
    数据在 NFC 芯片中,可以简单理解成“刷标签”。本质上就是通过支持 NFC 的手机或其它电子设备从带有 NFC 芯片的标签、贴纸、名片等媒介中读写信息。通常 NFC 标签是不需要外部供电的。当支持 NFC 的外设向 NFC 读写数据时,它会发送某种磁场,而这个磁场会自动的向 NFC 标签供电。

  • 仿真卡模式
    数据在支持 NFC 的手机或其它电子设备中,可以简单理解成“刷手机”。本质上就是将支持 NFC 的手机或其它电子设备当成借记卡、公交卡、门禁卡等 IC 卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持 NFC 的外设中 。在使用时还需要一个 NFC 射频器(相当于刷卡器)。将手机靠近 NFC 射频器,手机就会接收到 NFC 射频器发过来的信号,在通过一系列复杂的验证后,将 IC 卡的相应信息传入 NFC 射频器,最后这些 IC 卡数据会传入 NFC 射频器连接的电脑,并进行相应的处理(如电子转帐、开门等操作)。

  • 点对点模式
    该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有“刷”的感觉了。其有效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使用 Android4.2,NFC会直接利用蓝牙传输。这种技术被称为 AndroidBeam。所以使用 androidBeam 传输数据的两部设备不再限于4厘米之内。

准备工作

1. 在清单文件中,设置权限和配置 launchMode 属性

 <uses-permission android:name="android.permission.NFC" /> <uses-featureandroid:name="android.hardware.nfc"android:required="true" />...<activityandroid:name=".ui.RunUrlActivity"android:exported="false"android:launchMode="singleTop" />

注意:通常来说,所有处理 NFCActivity 都要设置 launchMode 属性为 singleTop 或者 singleTask,保证了无论 NFC 标签靠近手机多少次,Activity 实例只有一个。

2. BaseNfcActivity.java

public abstract class BaseNfcActivity extends AppCompatActivity {private NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);View view = LayoutInflater.from(this).inflate(getLayoutId(), null);setContentView(view);ButterKnife.bind(this);initView();}protected abstract int getLayoutId();protected abstract void initView();/*** 启动Activity,界面可见时*/@Overrideprotected void onStart() {super.onStart();mNfcAdapter = NfcAdapter.getDefaultAdapter(this);//一旦截获NFC消息,就会通过PendingIntent调用窗口mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);}/*** 获得焦点,按钮可以点击*/@Overridepublic void onResume() {super.onResume();//设置处理优于所有其他NFC的处理if (mNfcAdapter != null)mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);}/*** 暂停Activity,界面获取焦点,按钮可以点击*/@Overridepublic void onPause() {super.onPause();//恢复默认状态if (mNfcAdapter != null)mNfcAdapter.disableForegroundDispatch(this);}/*** 不带参数的跳转** @param clazz 跳转到的目标类*/protected void readyGo(final Class<?> clazz) {Intent intent = new Intent(this, clazz);startActivity(intent);}/*** 带参数的跳转** @param clazz  跳转到的目标类* @param bundle 参数*/protected void readyGo(final Class<?> clazz, final Bundle bundle) {Intent intent = new Intent(this, clazz);if (bundle != null) {intent.putExtras(bundle);}startActivity(intent);}
}

简单实例

场景:现将应用程序的包写到 NFC 程序上,然后我们将 NFC 标签靠近 Android 手机,手机就会自动运行包所对应的程序,这个是 NFC 比较基本的一个应用。下面以贴近标签自动运行 Android 自带的“短信”为例。
1. 获取 Tag 对象

@Overridepublic void onNewIntent(Intent intent) {super.onNewIntent(intent);if (mPackageName == null)return;//1.获取Tag对象Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);writeNFCTag(detectedTag);}

2. 判断 NFC 标签的数据类型(通过 Ndef.get 方法)

 //2.判断NFC标签的数据类型(通过Ndef.get方法)Ndef ndef = Ndef.get(tag);

3. 写入数据

 //3.写入数据ndef.writeNdefMessage(ndefMessage);

完整代码

public class RunAppActivity extends BaseNfcActivity {private String mPackageName = "com.android.mms";//短信@BindView(R.id.topbar)QMUITopBar mTopBar;@Overrideprotected int getLayoutId() {return R.layout.activity_run_app;}@Overrideprotected void initView() {mTopBar.setTitle("自动运行程序");}@Overridepublic void onNewIntent(Intent intent) {super.onNewIntent(intent);if (mPackageName == null)return;//1.获取Tag对象Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);writeNFCTag(detectedTag);}/*** 往标签写数据的方法** @param tag*/public void writeNFCTag(Tag tag) {if (tag == null) {return;}NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord.createApplicationRecord(mPackageName)});//转换成字节获得大小int size = ndefMessage.toByteArray().length;try {//2.判断NFC标签的数据类型(通过Ndef.get方法)Ndef ndef = Ndef.get(tag);//判断是否为NDEF标签if (ndef != null) {ndef.connect();//判断是否支持可写if (!ndef.isWritable()) {return;}//判断标签的容量是否够用if (ndef.getMaxSize() < size) {return;}//3.写入数据ndef.writeNdefMessage(ndefMessage);Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();} else { //当我们买回来的NFC标签是没有格式化的,或者没有分区的执行此步//Ndef格式类NdefFormatable format = NdefFormatable.get(tag);//判断是否获得了NdefFormatable对象,有一些标签是只读的或者不允许格式化的if (format != null) {//连接format.connect();//格式化并将信息写入标签format.format(ndefMessage);Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();}}} catch (Exception e) {}}
}

测试方法:
NFC 标签贴近手机背面,自动写入数据,此时退出所有程序,返回桌面,然后再将 NFC 标签贴近手机背面,将会看到自动打开了“短信”。

Android 项目必备(二十)-->NFC 的基本使用相关推荐

  1. Android 项目必备(十六)--> 手机号 验证码 密码

    文章目录 手机号 验证码 密码 在我们的项目中,获取验证码.手机号验证以及密码输入是很常见的小功能. 手机号 1. 布局文件 <EditTextandroid:id="@+id/et_ ...

  2. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十(下单) 0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单 ...

  3. Android项目必备技术

    1.一个APP只需要一个Activity //片段fragmentimplementation 'me.yokeyword:fragmentation:1.3.6'implementation 'me ...

  4. Android 项目必备(二十六)-->获取手机中所有 APP

    效果图 代码 添加依赖 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30' implementation ...

  5. Android 项目必备(二十九)-->App 在线升级与更新

    文章目录 前言 实战 前言 1. 用户使用 App 的时候升级提醒有两种方式获得: 通过应用市场获取: 打开应用之后提醒用户更新升级. 2. 更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升 ...

  6. Android 项目必备(四十二)-->Android 多窗口模式

    简介 自由窗口模式: 该模式类似于常见的桌面操作系统, 应用界面的窗口可以自由的拖动和修改大小. 分屏模式 该模式可以在手机上使用, 该模式将屏幕一分为二, 同时显示两个应用界面. 画中画模式: 该模 ...

  7. Android 项目必备(三十八)-->APP 消息推送

    文章目录 前言 推送的实现方式 1. C2DM 2. 轮询 3. SMS信令推送 4. MQTT协议 5. XMPP协议 6. 使用第三方平台 Android 中 MQTT 的使用 1. 集成 2. ...

  8. Android 项目必备(二十一)-->APP 多语言切换(国际化)

    最近公司开始做多语言版本,由于之前没有做过,所以在网上搜寻了一番这方面的资料,最后经过实践.总结,写下了这篇文章. 效果图 实现 1. 创建对应语言的 string.xml 简体中文,繁体和 Engl ...

  9. Android 项目必备(三十五)-->登录界面—用户协议解决方案

    文章目录 效果图 代码实现 效果图 一般来说每个 app 都有这个用户协议阅读相关的功能,之前做的都是一个协议,也都是单行的,完全没有复杂度,可以一个 checkbox 加上一个 textview 来 ...

  10. Android 项目必备(二十七)-->加密和解密

    概况 在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道加密密钥.这类加密算法技术较为成熟,加密效率高. 在非对称加密算法中,收发双方使用不同的密钥,发方使用公开密钥对消息进行加密,收发使用 ...

最新文章

  1. 兼容性—IE6/7下带有overflow:hidden属性的父级元素包不住带有position:relative属性的子元素...
  2. ISIS建立邻居的条件
  3. mac java jdk_mac下java JDK的下载安装和配置
  4. JQuery变量数字相加的研究
  5. linux下Makefile的简单例子及解释
  6. pycharm的安装与python解释器的安装,pip环境变量的配置要不然使用pip时报不是内部命令
  7. C#开发Android应用的必备——Mono for Android V1.0 发布
  8. OpenYurt 单元化部署新增 Patch 特性
  9. 第九章 Redis过期策略
  10. Why Opportunity list is empty
  11. GitHub的基础使用入门
  12. openlayer 图层上下_OpenLayers 3 的图层体系结构
  13. 全国身份证号码归属地表格
  14. 堪萨斯大学计算机硕士,美国堪萨斯大学计算机工程研究生申请要求
  15. java最新全套学习视频(java,前端,其他语言)
  16. bzoj 4453: cys就是要拿英魂!(后缀数组+二分)
  17. QQ登录的加密传输安全
  18. 了解JavaScript的Flow、认识Flow及其简单用法
  19. 数据结构实验6图的应用-行车路线问题
  20. c语言字符型常量计算,c语言字符型常量和变量.doc

热门文章

  1. rs429-HI3282-HI3182笔记
  2. 艾伦·图灵天才的一生,为什么却蒙羞而死?这是被时代所亏欠的一生!
  3. 2019-CS224n-Assignment2
  4. 谷歌地图高精度模型提取4(完结篇)
  5. 前端开发实习面经总结
  6. 2021年河南省中等职业教育技能大赛 网络搭建与应用项目
  7. 简单C语言程序的编写,c语言编写简单程序.doc
  8. 为什么我们应该使用 HTML5 开发网站
  9. oracle 查询字段去空格,ORACLE 所有表的所有字段去空格方法
  10. Java 读取PDF中的表格