NFC库,兼容4.3之前API以及4.4之后的API,读卡器模式,Sample读取羊城通卡号、余额、交易记录
无意中从事C++开发的龙腿和我聊起适配,萌发了我想写各种各样的Android适配方面的东西,这个库算是一个开端,适配不同版本(4.4之前和之后)的NFC(读卡器模式)
本库将NFC的CardReader模式在API 4.3以及API 4.4之后不同的注册方式进行统一封装处理,使用本库不必考虑版本API差异,仅按照生命周期调用注册即可。
本库的Sample例子:利用手机NFC读出城市一卡通(羊城通、深圳通)的卡号、余额、交易记录
| sony xm50t(4.3) | oppo A37m(5.1) | 锤子 坚果pro(7.1.1) |
|---|---|---|
| nexus 6(5.0) | mate8 QQ-卡号 | mate8 QQ-记录 |
1.使用Gradle依赖
compile 'com.ppy:nfclib:1.0.0'
2.初始化
本库所有API统一从NfcCardReaderManager调用,NfcCardReaderManager采用建造者,初始化如下:
private NfcCardReaderManager mReaderManager; private void initNfcCardReader() { mReaderManager = new NfcCardReaderManager.Builder(this) .enableSound(false)//设置是否有声音 .build(); }
3.生命周期调用进行注册NFC
@Override protected void onResume() { super.onResume(); mReaderManager.onResume(); } @Override protected void onPause() { super.onPause(); mReaderManager.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mReaderManager.onDestroy(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); mReaderManager.onNewIntent(intent); }
4.初始化的时候设置监听,一旦卡片贴紧NFC感应处,将回调onCardConnected
private CardOperatorListener mCardOperatorListener = new CardOperatorListener() { @Override public void onCardConnected(boolean isConnected) { if(isConnected) { //TODO 卡片已经贴在NFC感应处 } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initNfcCardReader();//初始化 mReaderManager.setOnCardOperatorListener(mCardOperatorListener);//设置监听 }
5.当回调NFC已读取卡片标签,则可以调用NfcCardReaderManager如下方法进行指令(APDU)操作。
public String sendData(byte[] data) throws IOException; public String sendData(String hexData) throws IOException; public byte[] tranceive(byte[] data) throws IOException; public byte[] tranceive(String hexData) throws IOException;
6.判断用户是否已经将卡贴在NFC感应处,可以调用NfcCardReaderManager的isCardConnected()方法
7.相关辅助工具类
| 作用 | 方法 |
|---|---|
| 设备是否提供NFC | Util.isNfcExits |
| 设备是否开启NFC | Util.isNfcEnable |
| 跳转NFC设置界面 | Util.intentToNfcSetting |
| 设备是否提供AndroidBeam | Util.isAndroidBeamExits |
| 设备是否开启AndroidBeam | Util.isAndroidBeamEnable |
| 跳转AndroidBeam设置界面 | Util.intentToNfcShare |
| 金额分转元 | Util.toAmountString |
| 16进制转10进制 | Util.hexToInt |
| 16进制转10进制(小端模式) | Util.hexToIntLittleEndian |
-
有一些机型会贴卡后一直回调Tag,导致一直重读。曾经出现过的机型三星S3,Android 4.3
-
NFC跳转至设置界面,锤子坚果pro,需要跳转到Android Beam,不清楚是否锤子系统都这样。测试版本smartisan v3.5.2
-
OPPO A37m机型需要同时开启NFC以及Android Beam,论坛也有人反馈,但是目前本人测试后并不需要,但是QQ读卡需要同时开启,目前不清楚。 (版本号:A37m_11_A.23_171025,内核版本:3.10.72-G201710251842,基带版本:MOLY.LR11.W1539.MD.TC16.JAD.SP.V1.P31.T47,2017年10月13日 16:19)
- 已测试机型如下表:
| 机型 | 版本 | ROM版本 |
|---|---|---|
| 索尼 | 4.3 | ~ |
| oppo | 5.1 | colorOs v3.0 |
| 锤子坚果pro | 7.1.1 | smartisan v3.5.2 |
| nexus 6 | 5.0/5.1.1/6.0.1/7.1.1 | ~ |
| mate 8 | 7.1.1 | EMUI 5.0 |
| p20 pro | 8.1.0 | EMUI 8.1.0 |
| ....希望大家一起测试完善 | .... | .... |
1.考虑解决重读问题
2.完善本库,增加卡模拟相关API
1.潘工
2.龙腿
谷歌官网NFC基础知识
谷歌官网NFC进阶知识
谷歌官网NFC卡模拟
本库关注的人并不多,目前也处于稳定使用,不定期佛性更新状态,如有bug或者需求不满足需要改的可以联系我
写这个库由于之前工作中经常用NFC读写ETC卡(粤通卡、赣通卡、蒙通卡等),也短暂搞过读银行卡卡号,读城市交通卡(羊城通、深圳通)都是我看一些资料后写的。
博客:https://blog.csdn.net/scau_zhangpeng/article/details/70162775
Email:scau_zhangpeng@163.com
| 微信 | |
|---|---|