场景

APP中读取NFC卡中的标签ID,作为用户的唯一标识进行登录验证。

首先需要确保手机支持NFC功能。其次具备一张NFC卡片。

读取id就是利用的读卡器模式,当把卡片靠近手机的NFC天线的时候,NFC会识别到卡,

然后把卡对象装到intent里面,

并发送广播NfcAdapter.ACTION_TECH_DISCOVERED,

应用程序接到这个广播之后,通过intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)来获取到卡对象,

然后就可以对卡进行读写

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、新建项目,添加权限

打开Android Studio新建一个项目,在AndroidManifest.xml中添加权限。

    <!--    NFC所需权限--><uses-permission android:name="android.permission.NFC" /><!-- 要求当前设备必须要有NFC芯片 --><uses-feature android:name="android.hardware.nfc" android:required="true" />

2、将要读取NFC的Activity设置为singleTop

这里是在MainActivity中

        <activity android:name=".MainActivity" android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

Activity共有四种启动模式:

standard

标准模式,也是Activity的默认启动模式,允许存在多个Activity实例,

每次启动页面时都会生成一个新的Activity实例。

singleTop

相比于standard,有新的页面启动请求时,当目标Activity处于当前栈顶时,

会调用Activity的onNewIntent()方法,但不创建新实例;其他情况都和standard一致。

其他两种不做介绍。

NFC检测到对象时,会在系统startActivity,那么目标activity已经是启动了,

所以我们需要在onNewIntent方法中接受tag对象,同时activity启动模式设为singleTop或singleTask也为了避免重复创建实例

3、设计页面布局

打开activity_main.xml,修改如下

​
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#151414"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_centerInParent="true"><TextViewandroid:layout_width="wrap_content"android:text="读取到的卡UID: "android:textColor="#fff"android:layout_height="wrap_content" /><TextViewandroid:textColor="#fff"android:id="@+id/tv_uid"android:text="                            "android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
</RelativeLayout>​

4、修改Activity

在OnCreate方法中,获取NfcAdapter实例,然后获取通知,判断支持NFC并且打开后,当获取通知后会调用onNewIntent方法。

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取显示文本框tvUid = (TextView) findViewById(R.id.tv_uid);//获取NfcAdapter实例nfcAdapter = NfcAdapter.getDefaultAdapter(this);//获取通知pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);//如果获取不到则不支持NFCif (nfcAdapter == null) {Toast.makeText(MainActivity.this,"设备不支持NFC",Toast.LENGTH_LONG).show();return;}//如果获取到的为不可用状态则未启用NFCif (nfcAdapter!=null&&!nfcAdapter.isEnabled()) {Toast.makeText(MainActivity.this,"请在系统设置中先启用NFC功能",Toast.LENGTH_LONG).show();return;}//因为启动模式是singleTop,于是会调用onNewIntent方法onNewIntent(getIntent());}

在onNewIntent中,解析intent携带的卡对象

    @Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);//获取、传递、解析intent对象,intent中携带卡对象resolveIntent(intent);}//解析intentvoid resolveIntent(Intent intent) {//获取intent中携带的标签对象Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);if (tag != null) {//处理标签对象processTag(intent);}}

在处理标签对象的方法中获取携带的数据中的ID字节数组并转换成十六进制字符串显示。

    //处理tagpublic void processTag(Intent intent) {//获取到卡对象Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//获取卡id这里即uid,字节数组类型byte[] aa = tagFromIntent.getId();//字节数组转十六进制字符串String str = ByteArrayToHexString(aa);tvUid.setText(str);}

完整Activity代码

package com.badao.nfcdemo;import androidx.appcompat.app.AppCompatActivity;import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private NfcAdapter nfcAdapter;private PendingIntent pendingIntent;private TextView tvUid;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取显示文本框tvUid = (TextView) findViewById(R.id.tv_uid);//获取NfcAdapter实例nfcAdapter = NfcAdapter.getDefaultAdapter(this);//获取通知pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);//如果获取不到则不支持NFCif (nfcAdapter == null) {Toast.makeText(MainActivity.this,"设备不支持NFC",Toast.LENGTH_LONG).show();return;}//如果获取到的为不可用状态则未启用NFCif (nfcAdapter!=null&&!nfcAdapter.isEnabled()) {Toast.makeText(MainActivity.this,"请在系统设置中先启用NFC功能",Toast.LENGTH_LONG).show();return;}//因为启动模式是singleTop,于是会调用onNewIntent方法onNewIntent(getIntent());}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);//获取、传递、解析intent对象,intent中携带卡对象resolveIntent(intent);}//解析intentvoid resolveIntent(Intent intent) {//获取intent中携带的标签对象Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);if (tag != null) {//处理标签对象processTag(intent);}}//字节数组转换十六进制private String ByteArrayToHexString(byte[] inarray) {int i, j, in;String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A","B", "C", "D", "E", "F" };String out = "";for (j = 0; j < inarray.length; ++j) {in = (int) inarray[j] & 0xff;i = (in >> 4) & 0x0f;out += hex[i];i = in & 0x0f;out += hex[i];}return out;}//处理tagpublic void processTag(Intent intent) {//获取到卡对象Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//获取卡id这里即uid,字节数组类型byte[] aa = tagFromIntent.getId();//字节数组转十六进制字符串String str = ByteArrayToHexString(aa);tvUid.setText(str);}@Overrideprotected void onPause() {super.onPause();if (nfcAdapter != null)//设置程序不优先处理nfcAdapter.disableForegroundDispatch(this);}@Overrideprotected void onResume() {super.onResume();if (nfcAdapter != null)//设置程序优先处理nfcAdapter.enableForegroundDispatch(this, pendingIntent,null, null);}}

5、运行app,打开nfc,将NFC卡片靠近手机

可以以debug模式运行,依次打断点查看效果

Android中读取NFC标签卡中的ID相关推荐

  1. python中读取文件过程中seek()函数的使用

    python中读取文件过程中seek()函数的使用 目录 概述: 语法: 参数: 返回值: 实例: 概述: seek() 方法用于移动文件读取指针到指定位置. 语法: seek() 方法语法如下: 文 ...

  2. 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)

    打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...

  3. android 获取nfc,Android:在服务类中读取NFC标签

    我正在开发一个应用程序,我需要读取存储在NFC标签中的数据,通过数据我的意思是简单的整数值,如0,1,2,3等. 从NFC读取数据的function在Activity类中工作正常但我需要在后台运行应用 ...

  4. java中读取Excel表格中的数据

    2019独角兽企业重金招聘Python工程师标准>>> 有关java中读取有上传的Excel文件,上传的Excel文件后缀可分为xls,xlsx 1:.xls后缀的文件在获取Work ...

  5. mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)

    Java中Transient关键字 虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的 ...

  6. mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别

    从Python发展历史谈起 Python3和Python2表示字符序列的方式有所不同. Python3字符序列的两种表示为byte和str.前者的实例包含原始的8位值,即原始的字节:后者的实例包括Un ...

  7. java从文本中读取,从Java中的文本文件中读取long类型

    我试图从BufferedReader类的readLine()方法从文本文件中读取长类型,然后我使用StringTokenizer解析第一个标记(这是长类型编号),但我面临的异常错误是java.lang ...

  8. java excel 中文乱码_java中读取excel文件中字符串乱码问题解决方法

    以前的时候发现直接java读取一个excel文件输出里面的字符串会乱码,中文字符不会乱码,但是遇到英文的时候输出会乱码.这个问题太奇怪了. 我的表格名字为Shirley.xls. 我曾经直接读取exc ...

  9. java中如何获取字节数组_如何从java中读取字节数组中的数据

    大家好 我将一个mp3文件转换为字节数组,我从字节数组中读取,但它显示行号15的空指针异常 我的代码: public class MainClass { static byte[] bytesarra ...

最新文章

  1. SQLSERVER系统数据库工作原理
  2. 男神青涩时纤毫毕现!腾讯AI模型GFPGAN火上GitHub热榜第一,Demo在线可玩
  3. java 继承先后顺序_Java中的继承关系的加载顺序
  4. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法
  5. python求数列的积_python小游戏学习笔记4-2(列表【】,数列矩阵排列)
  6. C语言 NULL与0 对应的地址
  7. android 获取monkey日志_APP压力测试定位问题_monkey篇
  8. 什么是GraphQL? 普通神话被揭穿。
  9. SlideSwitch仿iphone滑动开关组件,仿百度魔图滑动开关组件Android
  10. 人脸识别帧数太低的解决方法
  11. bingo卡片js代码_Excel Bingo卡随机数代码
  12. javaWeb--MVC
  13. win10清理_卸载全家桶之后:用win10自带杀软,怎么清理电脑垃圾?
  14. gl.glenable()介绍
  15. Cobalt Strike 插件CrossC2(小白教程)
  16. html中输入框中“请输入关键字”的设置
  17. ABB机器人:工件坐标系介绍以及标定操作与使用方法
  18. 无法kill掉的僵尸进程
  19. 广东迅视资管 长沙青年创客推荐“励”字为2020湖南年度字
  20. macOS Xcode C语言使用延时函数

热门文章

  1. 使用tensorflow书写逻辑回归
  2. Linux下的Ubuntu16.04系统配置并使用USB转串口(串口转USB),最终使用python的serial和pyserial包实现串口的打开并读取数据
  3. 质数,约数(数论) AcWing算法课
  4. Linux使用vsftpd搭建FTP服务
  5. 前后端分离开发,日志应该如何进行记录,在出现问题的时候,方便定位问题
  6. MySQL安装及可能出现的问题
  7. 计算机应用技术商务网站运营,计算机应用技术云计算与商务网站运营有什么区别...
  8. python怎么导入txt数据库_Python导入txt数据到mysql的方法
  9. 计算机更新80072f76,win10系统出现错误代码0x80072f76的解决方法
  10. python元素定位id和name_Python Selenium定位html元素|find_element_by_class-name-id-tag-css-xpath-text...