天天看點

基于NFC的Android讀寫軟體,Android基于nfc的讀寫(一)

這裡寫自定義目錄标題

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.如果沒有應用程式篩選任何意圖,請不執行任何操作。

大家可以參考這張圖

基于NFC的Android讀寫軟體,Android基于nfc的讀寫(一)

然後将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.