這裡寫自定義目錄标題
Android的NFC讀寫(一)
NFC簡介
代碼解析
源碼(Demo)
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權限,檔案内容如下:
标簽排程系統的基本工作方式如下:
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集合中支援的技術,如下所示:
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClassic
android.nfc.tech.MifareUltralight
在主界面方法裡判斷手機是否具有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.