1.首先要在AndroidManifest.xml中声明如下配置信息:

为了能够使用Android手机的NFC功能,需要在Manifest文件中添加相应的权限:

详细配置请参考-->Android NFC标签读写配置过滤器总结

<uses-permission android:name="android.permission.NFC" />
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

2.NFC TAG的发布系统:

当android设备扫描到一个NFC标签时,会自动寻找最适合的Activity来处理这个TAG,如果有多个Activity满足条件的话,会让用户来选择到底使用哪一个Activity来处理,可以理解为就是简单的事件响应与事件处理。

那么如何让一个Activity监听 ”当扫描到NFC标签时” 的这一个事件呢?使用intent filter。

可以理解为当检测到一个NFC标签时,系统自动创建一个相关Intent对象,含有响应intent-filter的Activity将处理这个Intent。

其中,intent filter声明如下:(在AndroidManifest.xml中声明在你需要捕获这个Intent的Activity里)(如下是识别公交卡的TECH格式过滤标签)即ACTION_TECH_DISCOVERED类型的过滤器:

<activity android:name=".NFCActivity"  android:launchMode="singleInstance"><intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /></intent-filter><meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" />
</activity>

配置android:name=".NFCActivity"是为了当退出app时只要扫描卡片能直接打开app并定位到NFC扫描界面。

在res文件夹下新建一个xml的文件夹,里面放的是Android支持的NFC类型的配置数据。nfc_tech_filter.xml如下:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- 可以处理所有Android支持的NFC类型 --><tech-list><tech>android.nfc.tech.IsoDep</tech></tech-list><tech-list><tech>android.nfc.tech.NfcA</tech></tech-list><tech-list><tech>android.nfc.tech.NfcB</tech></tech-list><tech-list><tech>android.nfc.tech.NfcF</tech></tech-list><tech-list><tech>android.nfc.tech.NfcV</tech></tech-list><tech-list><tech>android.nfc.tech.Ndef</tech></tech-list><tech-list><tech>android.nfc.tech.NdefFormatable</tech></tech-list><tech-list><tech>android.nfc.tech.MifareUltralight</tech></tech-list><tech-list><tech>android.nfc.tech.MifareClassic</tech></tech-list>
</resources>

另外还有ACTION_NDEF_DISCOVERED类型的过滤器

<intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" />
</intent-filter>

ACTION_TAG_DISCOVERED类型的过滤器

<intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED"/><category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

3.详细代码如下:

res/layout/nfc_info.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/app_background">
<LinearLayout android:orientation="vertical" android:layout_width="match_parent"android:layout_height="wrap_content"><AbsoluteLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:clickable="true"><TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:textSize="@dimen/enfore_title"android:textColor="@color/enfore_title"android:layout_x="0dp"android:layout_y="0dp"android:text="NFC测试"android:gravity="center"/><com.golden.test.iconfont.IconFontTextview     android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/enfore_title"android:textColor="@drawable/back_btn"android:paddingTop="15dp"android:paddingLeft="10dp"android:text=""android:clickable="true"android:gravity="left|center_vertical"android:layout_x="0dp"android:layout_y="0dp"android:onClick="btn_back"/></AbsoluteLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_margin="5dp"><TextView android:id="@+id/promt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/enfore_title"android:text="NFC扫描中..."android:textSize="@dimen/app_info"/></LinearLayout></LinearLayout>
</ScrollView>

NFCActivity.java

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;public class NFCActivity extends Activity {NfcAdapter nfcAdapter;TextView promt;private PendingIntent pi;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.nfc_info);promt = (TextView) findViewById(R.id.promt);// 获取默认的NFC控制器nfcAdapter = NfcAdapter.getDefaultAdapter(this);pi = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);if (nfcAdapter == null) {Toast.makeText(this, "对不起,您的设备不支持nfc功能!", Toast.LENGTH_SHORT).show();//promt.setText("设备不支持NFC!");finish();return;}if (!nfcAdapter.isEnabled()) {Toast.makeText(this, "请在系统设置中开启NFC功能!", Toast.LENGTH_SHORT).show();//promt.setText("请在系统设置中先启用NFC功能!");finish();return;}}public void btn_back(View view){this.finish();}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);// 当前app正在前端界面运行,这个时候有intent发送过来,那么系统就会调用onNewIntent回调方法,将intent传送过来// 我们只需要在这里检验这个intent是否是NFC相关的intent,如果是,就调用处理方法if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {processIntent(intent);}}//页面获取焦点@Overrideprotected void onResume() {super.onResume();nfcAdapter.enableForegroundDispatch(this, pi, null, null);}//页面失去焦点@Overrideprotected void onPause() {super.onPause();if(nfcAdapter!=null){nfcAdapter.disableForegroundDispatch(this);//关闭前台发布系统}}/*@Overrideprotected void onResume() {super.onResume();//得到是否检测到ACTION_TECH_DISCOVERED触发if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {//处理该intentprocessIntent(getIntent());}}*///字符序列转换为16进制字符串private String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder("0x");if (src == null || src.length <= 0) {return null;}char[] buffer = new char[2];for (int i = 0; i < src.length; i++) {buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);buffer[1] = Character.forDigit(src[i] & 0x0F, 16);System.out.println(buffer);stringBuilder.append(buffer);}return stringBuilder.toString();}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;}/*** Parses the NDEF Message from the intent and prints to the TextView*/private void processIntent(Intent intent) {//取出封装在intent中的TAGTag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);String CardId =ByteArrayToHexString(tagFromIntent.getId());String metaInfo = "";metaInfo+="卡片ID:"+CardId;for (String tech : tagFromIntent.getTechList()) {System.out.println(tech);}boolean auth = false;//读取TAGMifareClassic mfc = MifareClassic.get(tagFromIntent);try {//Enable I/O operations to the tag from this TagTechnology object.mfc.connect();int type = mfc.getType();//获取TAG的类型int sectorCount = mfc.getSectorCount();//获取TAG中包含的扇区数String typeS = "";switch (type) {case MifareClassic.TYPE_CLASSIC:typeS = "TYPE_CLASSIC";break;case MifareClassic.TYPE_PLUS:typeS = "TYPE_PLUS";break;case MifareClassic.TYPE_PRO:typeS = "TYPE_PRO";break;case MifareClassic.TYPE_UNKNOWN:typeS = "TYPE_UNKNOWN";break;}metaInfo += "\n卡片类型:" + typeS + "\n共" + sectorCount + "个扇区\n共"+ mfc.getBlockCount() + "个块\n存储空间: " + mfc.getSize() + "B\n";for (int j = 0; j < sectorCount; j++) {//Authenticate a sector with key A.auth = mfc.authenticateSectorWithKeyA(j,MifareClassic.KEY_DEFAULT);int bCount;int bIndex;if (auth) {metaInfo += "Sector " + j + ":验证成功\n";// 读取扇区中的块bCount = mfc.getBlockCountInSector(j);bIndex = mfc.sectorToBlock(j);for (int i = 0; i < bCount; i++) {byte[] data = mfc.readBlock(bIndex);metaInfo += "Block " + bIndex + " : "+ bytesToHexString(data) + "\n";bIndex++;}} else {metaInfo += "Sector " + j + ":验证失败\n";}}promt.setText(metaInfo);//Toast.makeText(this, metaInfo, Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();}}
}

4.运行效果图如下:

本人NFC扫描卡片功能就是参考模仿下面源码完成的。

详细请参考下载源码Eclipse版本-->Android NFC读MifareClassic卡获取卡片ID类型

如果想研究Android NFC源码读取公交卡信息余额和交易记录的

请参考另一篇文章-->Android NFC源码读取公交卡信息余额和交易记录

Android NFC读MifareClassic卡获取卡片ID 类型 扇区 存储空间相关推荐

  1. android rfid开发实例,Android NFC读卡 高频卡 RFID

    [实例简介] Android NFC读卡 高频卡 RFID 仅供参考,有需要这方面资料的可以联系我 961500278@qq.com [实例截图] [核心代码] d303bda7-45a0-4b95- ...

  2. Android nfc读卡模式流程

    最近一个项目需要将Android的nfc接口底层通过串口对接到外围一个单片机上,而nfc设备是接在单片机上的,这就需要对Android的nfc框架进行梳理,确定与单片机对接的接口通讯:上网查找发现资料 ...

  3. Android NFC读卡以及NFC的三种模式

    第一步添加权限: <uses-permission android:name="android.permission.NFC" /> <uses-permissi ...

  4. Android NFC读卡

    一  清单文件 1.权限 <uses-featureandroid:name="android.hardware.nfc"android:required="fal ...

  5. Android NFC 读取IC卡的简单封装

    一.NFC简介 NFC是一种近距离无线通信技术,一种非接触式的识别和互联技术. NFC由非接触式射频识别标准(RFID)及互联互通技术演变而成,通过在芯片上集成了感应式读卡器.感应式卡片和点对点三种功 ...

  6. android nfc ndef mifareclassic,Android NFC开发-实践篇

    Android NFC开发-实践篇 https://blog..net/_GYG/article/details/72899417 在Android NFC开发-理论篇中,我们了解了在Android中 ...

  7. Android NFC之仿真卡模式

    NFC三种模式之仿真卡模式 1.申请权限 2.HostApduService实现 3.注册Service 4.apduservice.xml配置 5.动态注册AID 6.读卡器端Apdu处理 读卡器模 ...

  8. android nfc读取公交卡信息_手机NFC可以复制小区用的门禁卡吗?

    很多带有NFC功能的手机和手环,可以用来代替小区门禁卡.公司门禁,以及各类一卡通.(NFC是一种非接触式通讯技术,工作的理论距离是0~10cm)以前出门必备手机.钱包.钥匙三件套,自移动支付出现.使用 ...

  9. android nfc读取公交卡信息_荣耀手机NFC升级了:公交、门禁、支付、饭卡、加密卡还能写卡...

    2019年双十一期间,入手了荣耀magic2手机,其实去年用过一次,今年换了多次还是特别喜欢,主要是麒麟980旗舰CPU,全面滑屏特有面子. 入手的第一时间,自己就启用了手机的钱包功能,手机钱包除了小 ...

最新文章

  1. PHP基础-自定义函数-变量范围-函数参数传递
  2. Oracle sql 中的字符(串)替换与转换[转载]
  3. 最终成为了热门的语言——python
  4. CTFshow 文件上传 web156
  5. 安装了silverlight还是提示_win10系统安装.netframework3.5方法
  6. 计算机在科技英语翻译中起的作用,浅谈科技英语翻译中英语词语的正确理解与表达...
  7. RS232应用----电功率计
  8. android 1141错误,Android Studio中报错的问题
  9. Python 数据结构与算法——从二分图到寻找最大排列(Maximum Permutation)
  10. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理
  11. ubuntu 无法定位软件包
  12. 机房重构-panel控件
  13. 前端博站项目中遇到的问题总结
  14. JavaFX源码分析和实战之音频播放:MediaPlayer和AudioClip播放音频剪辑以及AudioClip与MediaPlayer的区别
  15. win7怎样在线升级到win10 win7直接升级win10详细教程
  16. 华为交换机的基本配置命令
  17. 你真的理解:“学而不思则罔”? 什么是学习吗?
  18. 要怎样努力,才能成为很厉害的人?!
  19. 电子DIY:用单片机设计一款USB游戏手柄
  20. 设计模式(十三) 代理模式和Java动态代理

热门文章

  1. 解决国内手机安装Google Play打开闪退问题
  2. RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群
  3. java 监控linux服务器cpu使用率、内存使用率、磁盘使用率、java进程是否存活等服务
  4. 逍遥模拟器连接不到android,逍遥安卓模拟器无法连接网络的解决方法
  5. MP2451 VOUT计算公式 表
  6. 人脸姿态估计(计算欧拉角)
  7. mysql 根据日期查询周、月、年起止时间
  8. 根据ID或者ID集合查找树形结构数据里面ID所对应的节点信息
  9. 用友NCC产品API使用指南
  10. (Fabric学习坑)com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;