Android 项目必备(二十)-->NFC 的基本使用
文章目录
- 前言
- 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" />
注意:通常来说,所有处理 NFC
的 Activity
都要设置 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 的基本使用相关推荐
- Android 项目必备(十六)--> 手机号 验证码 密码
文章目录 手机号 验证码 密码 在我们的项目中,获取验证码.手机号验证以及密码输入是很常见的小功能. 手机号 1. 布局文件 <EditTextandroid:id="@+id/et_ ...
- Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)
Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十(下单) 0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单 ...
- Android项目必备技术
1.一个APP只需要一个Activity //片段fragmentimplementation 'me.yokeyword:fragmentation:1.3.6'implementation 'me ...
- Android 项目必备(二十六)-->获取手机中所有 APP
效果图 代码 添加依赖 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30' implementation ...
- Android 项目必备(二十九)-->App 在线升级与更新
文章目录 前言 实战 前言 1. 用户使用 App 的时候升级提醒有两种方式获得: 通过应用市场获取: 打开应用之后提醒用户更新升级. 2. 更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升 ...
- Android 项目必备(四十二)-->Android 多窗口模式
简介 自由窗口模式: 该模式类似于常见的桌面操作系统, 应用界面的窗口可以自由的拖动和修改大小. 分屏模式 该模式可以在手机上使用, 该模式将屏幕一分为二, 同时显示两个应用界面. 画中画模式: 该模 ...
- Android 项目必备(三十八)-->APP 消息推送
文章目录 前言 推送的实现方式 1. C2DM 2. 轮询 3. SMS信令推送 4. MQTT协议 5. XMPP协议 6. 使用第三方平台 Android 中 MQTT 的使用 1. 集成 2. ...
- Android 项目必备(二十一)-->APP 多语言切换(国际化)
最近公司开始做多语言版本,由于之前没有做过,所以在网上搜寻了一番这方面的资料,最后经过实践.总结,写下了这篇文章. 效果图 实现 1. 创建对应语言的 string.xml 简体中文,繁体和 Engl ...
- Android 项目必备(三十五)-->登录界面—用户协议解决方案
文章目录 效果图 代码实现 效果图 一般来说每个 app 都有这个用户协议阅读相关的功能,之前做的都是一个协议,也都是单行的,完全没有复杂度,可以一个 checkbox 加上一个 textview 来 ...
- Android 项目必备(二十七)-->加密和解密
概况 在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道加密密钥.这类加密算法技术较为成熟,加密效率高. 在非对称加密算法中,收发双方使用不同的密钥,发方使用公开密钥对消息进行加密,收发使用 ...
最新文章
- 兼容性—IE6/7下带有overflow:hidden属性的父级元素包不住带有position:relative属性的子元素...
- ISIS建立邻居的条件
- mac java jdk_mac下java JDK的下载安装和配置
- JQuery变量数字相加的研究
- linux下Makefile的简单例子及解释
- pycharm的安装与python解释器的安装,pip环境变量的配置要不然使用pip时报不是内部命令
- C#开发Android应用的必备——Mono for Android V1.0 发布
- OpenYurt 单元化部署新增 Patch 特性
- 第九章 Redis过期策略
- Why Opportunity list is empty
- GitHub的基础使用入门
- openlayer 图层上下_OpenLayers 3 的图层体系结构
- 全国身份证号码归属地表格
- 堪萨斯大学计算机硕士,美国堪萨斯大学计算机工程研究生申请要求
- java最新全套学习视频(java,前端,其他语言)
- bzoj 4453: cys就是要拿英魂!(后缀数组+二分)
- QQ登录的加密传输安全
- 了解JavaScript的Flow、认识Flow及其简单用法
- 数据结构实验6图的应用-行车路线问题
- c语言字符型常量计算,c语言字符型常量和变量.doc