NFC读模式工作流程:NFC芯片轮询执行读模式、点对点和卡模式,当把卡片靠近手机的NFC天线的时候,NFC会识别到卡,然后
把卡对象装到intent里面,并发送广播NfcAdapter.ACTION_TECH_DISCOVERED,应用程序接到这个广播之后,通过
intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)来获取到卡对象,然后就可以对卡进行读写。

了解这个之后,我们就可以写自己的应用了。

两个步骤完成:

1.注册接受广播和过滤器

用静态的方式,在AndroidManifest.xml注册,这样子activity不在运行状态的时候也可以接受到广播。

<activityandroid:name="nfc.read.test.main"android:screenOrientation="portrait"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /></intent-filter><meta-data android:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" /><intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

nfc_tech_filter.xml是过滤器,过滤哪些卡片

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><tech-list><tech>android.nfc.tech.IsoDep</tech></tech-list><tech-list><tech>android.nfc.tech.NfcV</tech></tech-list><tech-list><tech>android.nfc.tech.NfcF</tech></tech-list>
</resources>

2.处理接收到的广播
继承activity的方法public void onNewIntent(Intent intent);
用Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);获取到tag,
把tag转换为IsoDep isodep = IsoDep.get(tag);
也可以把tag转换为MifareClassic mfc = MifareClassic.get(tag);
这个根据读到的tag类型的转换,tag的类型有很多,饭卡门禁卡这些一般是MifareClassic,非接触银行卡公交卡这些一般是IsoDep。
举个例子,下面是读取深圳通卡的余额:

@Override
public void onNewIntent(Intent intent) {super.onNewIntent(intent);      // 1) Parse the intent and get the action that triggered this intentString action = intent.getAction();Log.d(TAG, "Discovered tag with intent: " + action);// 2) Check if it was triggered by a tag discovered interruption.if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {// 3) Get an instance of the TAG from the NfcAdapterTag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);            try{//Get an instance of the type A card from this TAGIsoDep isodep = IsoDep.get(tagFromIntent);isodep.connect();//select the card manager appletbyte[] mf = { (byte) '1', (byte) 'P',(byte) 'A', (byte) 'Y', (byte) '.', (byte) 'S', (byte) 'Y',(byte) 'S', (byte) '.', (byte) 'D', (byte) 'D', (byte) 'F',(byte) '0', (byte) '1', };byte[] mfRsp = isodep.transceive(getSelectCommand(mf));Log.d(TAG, "mfRsp:" + HexToString(mfRsp));//select Main Applicationbyte[] szt = { (byte) 'P', (byte) 'A', (byte) 'Y',(byte) '.', (byte) 'S', (byte) 'Z', (byte) 'T' };byte[] sztRsp = isodep.transceive(getSelectCommand(szt));Log.d(TAG, "sztRsp:" + HexToString(sztRsp));byte[] balance = { (byte) 0x80, (byte) 0x5C, 0x00, 0x02, 0x04};byte[] balanceRsp = isodep.transceive(balance);Log.d(TAG, "balanceRsp:" + HexToString(balanceRsp));if(balanceRsp!=null && balanceRsp.length>4){int cash = byteToInt(balanceRsp, 4);                   float ba = cash / 100.0f;EditText result = (EditText) findViewById(R.id.block4);result.setText("Balance:"+ba);}                isodep.close();}catch(Exception e){Log.e(TAG, "ERROR:" + e.getMessage());}}
}

下面是读取MifareClassic的例子,使用的是默认密钥:

@Override
public void onNewIntent(Intent intent) {super.onNewIntent(intent);      // 1) Parse the intent and get the action that triggered this intentString action = intent.getAction();Log.d(TAG, "Discovered tag with intent: " + action);// 2) Check if it was triggered by a tag discovered interruption.if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {// 3) Get an instance of the TAG from the NfcAdapterTag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);    try {//Get an instance of the Mifare classic card from this TAGMifareClassic mfc = MifareClassic.get(tagFromIntent);mfc.connect();Log.d(TAG, "sectorCount=" + mfc.getSectorCount());int block = 4;EditText result = (EditText) findViewById(R.id.block4);//use default key to authenticateboolean auth = mfc.authenticateSectorWithKeyA(block / 4, MifareClassic.KEY_DEFAULT);if (auth) {// read blockif (FunctionFlag == 0) {byte[] data = mfc.readBlock(block);result.setText(HexToString(data));}// write blockelse if (FunctionFlag == 1) {byte[] data = StringToHex(result.getText().toString());mfc.writeBlock(block, data);}}mfc.close();} catch (Exception e) {Log.e(TAG, "ERROR:" + e.getMessage());}}
}

记得添加NFC的权限

<uses-permission android:name="android.permission.NFC" />

源码下载地址,百度网盘:
链接: http://pan.baidu.com/s/1Ectjo 密码: n3mk

android使用NFC的读模式相关推荐

  1. android预读内容,傲游浏览器Android新版 增加预读模式

    傲游浏览器Android新版 增加预读模式 2012年06月06日 16:18作者:陈涛编辑:陈涛文章出处:泡泡网原创 分享 泡泡网软件频道6月6日 自2010年以来移动互联网高速发展,带动了移动设备 ...

  2. android通过NFC读取公交卡的余额和交易记录

    通过NFC的读模式,读取公交卡的余额和交易记录.这是一个开源的工程,可以读取深圳通.羊城通.北京卡.八达通.武汉通等等. 读取分四个步骤: 1.select PSF (1PAY.SYS.DDF01) ...

  3. Android使用NFC读卡实现 (一)

    Android使用NFC读卡实现 (一) Android使用NFC读卡实现 (二) 这是一篇写的用带NFC芯片的手机读卡的过程. 首先是创建Android工程.

  4. android nfc扇区加密,android NFC MifareClassic 读IC卡加密扇区方法

    近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassi ...

  5. android nfc扇区加密,uniapp安卓NFC MifareClassic读IC卡加密扇区方法

    近段时间在做android下NFC的M1卡的加密扇区的读取,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassic类的源代码和基于android原生案例, ...

  6. android小说模式,傲游Android版预读模式让手机小说控大饱眼福

    自2010年以来移动互联网高速发展,带动了移动设备阅读文学作品的热潮.目前,中国手机网民规模达3.56亿,77%以上网民使用手机看小说.移动互联网的快速发展,让手机阅读进入了一个飞跃发展的阶段.但随着 ...

  7. Android适配 - 实现4.3以后NFC的CardReader模式

    Android 4.4更新了NFC的读卡器模式,具体API差异可以查看官方报告,本篇将梳理Android 4.3.Android 4.4以及之后版本的NFC读卡器模式的写法.(主要是对CPU卡的操作) ...

  8. android手机扇区数据读写,android NFC MifareClassic 读IC卡加密扇区方法

    近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassi ...

  9. Android NFC之读卡器模式

    NFC三种模式之读卡器模式 1.申请权限 2.过滤器的设置 3.接收卡片信息 仿真卡模式 NFC的工作模式 读卡器模式(Reader/writer mode).仿真卡模式(Card Emulation ...

最新文章

  1. C#笔记 Public,Private,Protected,Internal,Protected internal
  2. mysql client 5.1.34_mysql最新版
  3. OpenVINO FPS也可以达100帧
  4. InfluxDB 分布式时间序列数据库环境搭建——据qcon大会2016qiniu说集群很坑且闭源了...
  5. JavaWeb:用JDBC操作数据库
  6. 给自己看的flex布局方法
  7. 无线网络渗透测试-Gerix Wifi Cracker破解无线网络
  8. dowhlie java_Java while和do whlie语句
  9. 用官方2012版本131兆,一共有四个自带软件
  10. Java8 stream().map()将对象转换为其他对象
  11. DatePickerDialog日期对话框以及回调函数的用法
  12. 【mac】Mac 安装Brew命令
  13. hdu 1281 棋盘游戏 (二分匹配)
  14. 中国碳酸镁铝行业市场供需与战略研究报告
  15. iOS 上的相机捕捉 swift
  16. 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝
  17. Matlab实现身份证号码快速识别
  18. 设计模式基础-UML类图 (转自https://www.jianshu.com/p/0cd7df8a7789)
  19. 涨姿势 , JavaScript 玩转多线程编程~
  20. 程序员、架构师、技术经理、技术总监、CTO,怎么定位?

热门文章

  1. Verilator简介与使用
  2. tableau多边形地图和背景地图:设置地理信息(自定义地图码导入、设置地图源)
  3. 成都产科生产日记(十五)(建档、入院生产、上户、少儿互助金、疫苗、儿保)全...
  4. 阻容感基础09:电感器原理(3)-电感器参数
  5. 简体字与繁体字对照表 “学习繁体字”
  6. 计算机视觉资源汇总 - Part I
  7. Android Xpopup 使用日记
  8. access数据库剔除重复项_access数据库查询时如何让查出来的数据自动去除重复项...
  9. 小彬学vue系列专栏】 004 | 构建工具一如你初妆
  10. STM32F103ZE VL53L0X模块激光测距代码