记录一下使用安卓手机的NFC功能来识别各类高频RFID标签或卡片的基本操作思路。因为我的项目中还存在有大量的业务逻辑代码,所以只能整理出当中的一些重要步骤,并贴上代码片段。
1、第一步:在AndroidManifest.xml配置文件里增加以下权限
<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
<uses-sdk android:minSdkVersion="10"/>
需要注意的是,在sdk的版本是9的时候,仅仅只支持对ACTION_TAG_DISCOVERED操作。为了能够支持其它的数据类型操作,请把sdk版本保持在10以上。
2、第二步:在AndroidManifest.xml配置文件中增加对intent-filter的支持
<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支持的activity,当用户使用手机感应到NFC卡片的话,就会自动呼出该activit。
如果你的NFC卡片中的数据是纯文本,那么在mimeType属性中使用“text/plain”即可。另一种常见的使用场景是卡片中写有网址,在这种情况下,mimeType可以使用“http”或"https",这样配置的mimeType支持手机直接唤起默认浏览器,如下代码片段:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 以下是常规的识别NFC芯片的配置 -->
<!-- <data android:mimeType="text/plain"/> -->
<!-- 以下是用来识别写入了网址的NFC芯片的配置,这两项是Android 4.X原生系统自带浏览器的配置 -->
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
除了这些基本配置之外,还可以增加对各种不同的协议标准的支持。以下是一个相对完整的intent-filter配置:
<activity
android:name=".NfcScannerActivity"
android:label=""
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<!-- 定义NDEF类型的NFC -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 以下是常规的识别NFC芯片的配置 -->
<!-- <data android:mimeType="text/plain"/> -->
<!-- 以下是用来识别写入了网址的NFC芯片的配置,这两项是Android 4.X原生系统自带浏览器的配置 -->
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
<!-- 定义TECH类型的NFC -->
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<!-- TECH类型的NFC的扩展定义,位于xml/nfc_tech_filter.xml中 -->
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
<!-- 定义tag类型的NFC -->
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
</intent-filter>
</activity>
注意在这段配置中,有一段配置引用了xml/nfc_tech_filter.xml文件:
<!-- TECH类型的NFC的扩展定义,位于xml/nfc_tech_filter.xml中 -->
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc