1. AndroidManifest.xml 要加入
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" />
<application
<activity
android:launchMode="singleTop"> //設為本package的唯一應用. 確定刷多筆資料都會調用唯一apk
<intent-filter>
//當NFC 的NDEF格式為"mydata_type" 被偵測到時會以 NDEF_DISCOVERED action 啟動此APK
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="mydata_type" />
</intent-filter>
2. 在 MainActivity 繼承 CreateNdefMessageCallback, OnNdefPushCompleteCallback
public class MainActivity extends Activity implements CreateNdefMessageCallback,
OnNdefPushCompleteCallback {
需實作下列3個方法
@Override
public void onNewIntent(Intent intent) {
// 當設為 singleTop 時, 系統在重啟本Apk時會呼叫onNewIntent.此時只要把新的intent 設給目前的Apk 即可.
setIntent(intent);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
//當NFC 靠近時, NfcP2pLinkManager 呼叫這個callback, APK 在此包裝要送的資料, 格式. 系統會把msg 傳給遠端.
NdefMessage msg = /*建立自己的NDEF 內容*/;
return msg;
}
@Override
public void onNdefPushComplete(NfcEvent event) {
// NfcP2pLinkManager 告知msg 已傳完成
}
3. 在onCreate 時獲取 NfcAdapter 並設定callback 函數
@Override
protected void onCreate(Bundle savedInstanceState) {
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
mInfoText.setText("NFC is not available on this device.");
} else {
// Register callback to set NDEF message
mNfcAdapter.setNdefPushMessageCallback(this, this);
// Register callback to listen for message-sent success
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
}
}
4. NFC 傳送以一個以NdefMessage 包裝的物件
NdefMessage包含一或多個NdefRecord
NdefRecord 包含單筆資料, 內含格式代碼(type), id, 內容(payload)
可用
幫忙包裝NdefRecord. 若要請系統叫用特定APK 可用
createApplicationRecord(package_name)
製造AAR (Android Application Record) 格式
5. Android NFC 應用被NFC P2pLinkManager 叫用的流程,
(a) 系統感應到NFC 時尋找 AAR指定的package, 若沒有會連結 App Market.
(b) Apk 被包含 NDEF_DISCOVERED 的intent 叫起, 可在 onResume 時判斷intent 的action 來知道這是NDEF 叫起的,
public void onResume() {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());/*處理包在Intent 內的 NDEF message */
}
}
(c) 開始讀取NdefRecord
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
NdefRecord record = msg.getRecords()[i];
String payload = new String(record.getPayload());
(d) 傳資料給對方
NdefMessage msgOut = /* NdefRecords */
mNfcAdapter.setNdefPushMessage(msgOut, this, this);
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" />
<application
<activity
android:launchMode="singleTop"> //設為本package的唯一應用. 確定刷多筆資料都會調用唯一apk
<intent-filter>
//當NFC 的NDEF格式為"mydata_type" 被偵測到時會以 NDEF_DISCOVERED action 啟動此APK
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="mydata_type" />
</intent-filter>
2. 在 MainActivity 繼承 CreateNdefMessageCallback, OnNdefPushCompleteCallback
public class MainActivity extends Activity implements CreateNdefMessageCallback,
OnNdefPushCompleteCallback {
需實作下列3個方法
@Override
public void onNewIntent(Intent intent) {
// 當設為 singleTop 時, 系統在重啟本Apk時會呼叫onNewIntent.此時只要把新的intent 設給目前的Apk 即可.
setIntent(intent);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
//當NFC 靠近時, NfcP2pLinkManager 呼叫這個callback, APK 在此包裝要送的資料, 格式. 系統會把msg 傳給遠端.
NdefMessage msg = /*建立自己的NDEF 內容*/;
return msg;
}
@Override
public void onNdefPushComplete(NfcEvent event) {
// NfcP2pLinkManager 告知msg 已傳完成
}
3. 在onCreate 時獲取 NfcAdapter 並設定callback 函數
@Override
protected void onCreate(Bundle savedInstanceState) {
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
mInfoText.setText("NFC is not available on this device.");
} else {
// Register callback to set NDEF message
mNfcAdapter.setNdefPushMessageCallback(this, this);
// Register callback to listen for message-sent success
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
}
}
4. NFC 傳送以一個以NdefMessage 包裝的物件
NdefMessage包含一或多個NdefRecord
NdefRecord 包含單筆資料, 內含格式代碼(type), id, 內容(payload)
可用
createUri(Uri)
, //超連結格式 createMime(String, byte[])
//MIME 格式createExternal(String, String, byte[])
//自訂格式
幫忙包裝NdefRecord. 若要請系統叫用特定APK 可用
createApplicationRecord(package_name)
製造AAR (Android Application Record) 格式
5. Android NFC 應用被NFC P2pLinkManager 叫用的流程,
(a) 系統感應到NFC 時尋找 AAR指定的package, 若沒有會連結 App Market.
(b) Apk 被包含 NDEF_DISCOVERED 的intent 叫起, 可在 onResume 時判斷intent 的action 來知道這是NDEF 叫起的,
public void onResume() {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());/*處理包在Intent 內的 NDEF message */
}
}
(c) 開始讀取NdefRecord
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
NdefRecord record = msg.getRecords()[i];
String payload = new String(record.getPayload());
(d) 傳資料給對方
NdefMessage msgOut = /* NdefRecords */
mNfcAdapter.setNdefPushMessage(msgOut, this, this);