登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

NFC兼容库(4.3以及4.4以上)

scauzhangpeng   2018-11-22 23:22   收藏

NfcSample

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.相关辅助工具类

作用方法
设备是否提供NFCUtil.isNfcExits
设备是否开启NFCUtil.isNfcEnable
跳转NFC设置界面Util.intentToNfcSetting
设备是否提供AndroidBeamUtil.isAndroidBeamExits
设备是否开启AndroidBeamUtil.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~
oppo5.1colorOs v3.0
锤子坚果pro7.1.1smartisan v3.5.2
nexus 65.0/5.1.1/6.0.1/7.1.1~
mate 87.1.1EMUI 5.0
....希望大家一起测试完善........

TODO

1.考虑解决重读问题

2.完善本库,增加卡模拟相关API

感谢

1.潘工
2.龙腿

NFC参考链接

谷歌官网NFC基础知识
谷歌官网NFC进阶知识
谷歌官网NFC卡模拟

联系作者

本库关注的人并不多,目前也处于稳定使用,不定期佛性更新状态,如有bug或者需求不满足需要改的可以联系我
写这个库由于之前工作中经常用NFC读写ETC卡(粤通卡、赣通卡、蒙通卡等),也短暂搞过读银行卡卡号,读城市交通卡(羊城通、深圳通)都是我看一些资料后写的。
博客:https://blog.csdn.net/scau_zhangpeng/article/details/70162775
Email:scau_zhangpeng@163.com

微信QQ

项目地址:https://github.com/scauzhangpeng/NfcSample