Android NFC Programming Notes

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)
可用
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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值