Android基于nfc的读写(一)

Android的NFC读写(一)

近来,因需求需要开发nfc读写功能,网上查阅了许多资料,发现相关方面资料鱼龙混杂,许多demo甚至无法跑起来,于是无奈只能硬啃官方文档,终于颇有感悟,demo见末尾
nfc相关资料,大家可以参考以下几个网站,里面讲的非常透彻。
https://developer.android.com/guide/topics/connectivity/nfc
https://developer.android.com/guide/topics/connectivity/nfc/nfc.html
https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.html

NFC简介

这里简单的介绍一下nfc,近场通信(NFC)是一组短距离无线技术,通常需要4cm或更短的距离才能启动连接。NFC允许您在NFC标签和Android设备之间或两个Android设备之间共享小的数据有效负载。在Android中,我们通常会遇到三种操作模式:

  • 读/写模式,允许NFC设备读取和/或写入被动NFC标签和贴纸。
  • P2P模式,允许NFC设备与其他NFC对等体交换数据; Android Beam使用此操作模式。
  • 卡仿真模式,允许NFC设备本身充当NFC卡。然后,可以通过外部NFC读取器(例如NFC销售点终端)访问模拟的NFC卡。
    本文实现了nfc标签NDEF和ultralight两种格式的读取效果

代码解析

首先先配置android权限,文件内容如下:

 <!--配置过滤器-->
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="text/plain"/>
            </intent-filter>

            <intent-filter >
                <action android:name="android.nfc.action.TECH_DISCOVERED"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED"/>
            </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter"/>

标签调度系统的基本工作方式如下:

1.尝试以解析NFC标记(ACTION_NDEF_DISCOVERED或其中一个ACTION_TECH_DISCOVERED)时标记调度系统创建的意图启动一个Activity 。
2.如果没有活动过滤该意图,请尝试启动具有下一个最低优先级意图的活动(ACTION_TECH_DISCOVERED或者ACTION_TAG_DISCOVERED),直到应用程序筛选意图或标记分派系统尝试所有可能的意图。
3.如果没有应用程序筛选任何意图,请不执行任何操作。
大家可以参考这张图
在这里插入图片描述
然后将Activity启动模式设置为singleTop,在这种模式下,如果Activity已经在任务栈的栈顶了,当再次启动同一个Activity的时候,这个Activity不会被重新创建,而且它的onNewIntent()方法会被调用,但是它的onCreate()、onStart()方法不会被调用。
#####新建xml文件夹,新建nfc_tech文件(自定义):
该文件指定您的活动在tech-list集合中支持的技术,如下所示:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

在主界面方法里判断手机是否具有nfc功能,如下所示:

      if (mNfcAdapter == null) {
            Toast.makeText(this, "该设备不支持nfc", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        if (!mNfcAdapter.isEnabled()) {
                Toast.makeText(this, "请打开nfc开关", Toast.LENGTH_SHORT).show();
                Intent intent=new Intent(Settings.ACTION_NFC_SETTINGS);
                startActivity(intent);

            }

        //创建PendingIntent对象,当检查到一个tag标签就会执行此Intent
         mPendingIntent=PendingIntent.getActivity(this,0,new Intent(this,getClass()),0);

在onNewIntent方法中取出获取到的标签,并进入读取标签的方法:

     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        String techList[] = tag.getTechList();
        for (String tech : techList) {
            System.out.print(tech);
        }
        readNdeftag(tag);

自定义读取标签的方法:这里目前只做了NDEF格式的读取:

 Ndef ndef = Ndef.get(tag);
        try {
            ndef.connect();
            NdefMessage ndefMessage = ndef.getNdefMessage();
            if (ndefMessage != null) {
                mReadText.setText(parseTextRecord(ndefMessage.getRecords()[0]));
                Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
            }else {
                mReadText.setText("该标签为空标签");
            }

源码(Demo)

最后Demo已经上传,欢迎大家交流下载,不足之处,还望请教。

链接: https://github.com/zcyyouminghuo/Android_NfcDemo.

猜你喜欢

转载自blog.csdn.net/qq_42625299/article/details/89002481
今日推荐