Hướng dẫn sử dụng nfc trên android
NFC: Near Field Communication ( Giao tiếp tầm gần) Tìm hiểu công nghệ giao tiếp tầm gần (ngắn) NFC trong Android 1. NFC là gì? Là một công nghệ giao tiếp tầm gần (NFC) được phát triển dựa trên nguyên lý tần số vô tuyến nhận dạng (Radio-frequency identification - RFID) cho phép một gởi sóng radio đến một thẻ điện tử thụ động. NFC là một tập hợp các chuẩn cho các smartphones và các thiết bị tương tự để thiết lập liện lạc qua sóng vô tuyến với nhau bằng cách chạm chúng lại với nhau trong khoảng cách gần (một vài cm). Google giới thiệu NFC vào năm 2010 và smartphone Nexus S trở thành thiết bị Android đầu tiên được hỗ trợ NFC. Trên Android 4.0 (Ice Cream Sandwich) tính năng này được đặt tên là Android Beam giúp mở rộng khả năng kết nối và chia sẻ dữ liệu. Tổng quan về NFC Đặc điểm:
Dữ liệu có thể truyển tải:
Ứng dụng thực tế:
Ưu điểm:
2. Demo sử dụng NFC API Framework trên Android Dữ liệu được lưu trữ trong thẻ (tag) có thẻ được ghi bằng nhiều định dạng. Nhưng trong Android Framework API nó chỉ dựa trên một chuẩn của NFC Forum là NDEF (NFC Data Exchange Format) Tiêu chuẩn của NDEF Message: Trên Android đối tượng NDEF message là 1 định dạng nhị phân được sử dụng để đóng gói các dữ liệu được định kiểu. Nó được quy định bởi NFC Forum cho việc truyền tải và lưu trữ với NFC. NDEF định nghĩa các Messages và các Records. Đối tượng NDEF Record chứa đựng dữ liệu được định kiểu như MIME-type media, URI, hoặc một nội dung (payload) được tuỳ chỉnh. DEMO được chia làm 2 Part
PART 1: Ứng dụng demo: Tên: Sticky Notes Chức năng: Truyền dữ liệu (text) qua lại giữa 2 điện thoại có hỗ trợ NFC Yêu cầu:
Coding: Bắt đầu làm việc với NFC trên Android, triển khai NfcAdapter - lớp đại diện cho NFC trên device: Trong phương thức (PT) onCreate() của lớp StickyNotesActivity: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mNote = (EditText) findViewById(R.id.note); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if(mNfcAdapter == null) { mNote.setText("NFC not available on this device!"); return; } mNote.addTextChangedListener(mTextWatcher); mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndefDetected.addDataType("text/plain"); } catch (MalformedMimeTypeException e) { e.printStackTrace(); } mNdefExchangeFilters = new IntentFilter[] { ndefDetected }; }Trong phương thức (PT) này triển khai những thứ cần thiết để cho p2p làm việc.
Tiếp theo để cho phép gửi và nhận NDEF message, chúng ta tạo PT enableNdefExchangeMode() trong onResume(): private void enableNdefExchangeMode() { if(mNfcAdapter == null) { return; } if(Build.VERSION.SDK_INT < 14) { mNfcAdapter.enableForegroundNdefPush(this, getNoteAsNdef()); } else { mNfcAdapter.setNdefPushMessage(getNoteAsNdef(), this); } mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null); }PT này cho phép thiết bị khởi tạo kết nối ngang hàng peer to peer (p2p) thông qua NFC.
Sau khi nhận được message PT onNewIntent() được gọi: protected void onNewIntent(Intent intent) { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { NdefMessage[] msgs = getNdefMessages(intent); promptForContent(msgs[0]); } }Tại đây chúng nhận về NDEF message qua PT getNdefMessages() và phân tích chúng qua PT promptForContent() để nhận nội dung (payload) được gửi tới. Giải thích các PT: getNoteAsNdef(): Cài đặt NDEF message để gửi đi private NdefMessage getNoteAsNdef() { byte[] textBytes = mNote.getText().toString().getBytes(); NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, textBytes); return new NdefMessage(new NdefRecord[] { textRecord });}
promptForContent(NdefMessage[]):Thông báo tới người dùng để thay thế nội dung hiện tại thành nội dung (pay-load) được gửi tới private void promptForContent(final NdefMessage msg) { new AlertDialog.Builder(this).setTitle("Replace current content?") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { String msgPayload = "Messages Received: \n"; msgPayload += new String(msg.getRecords()[0].getPayload()); String body = new String(msgPayload); setNoteBody(body); } }) .setNegativeButton("No", null).show(); }getNdefMessages(): Lấy về NDEF message từ Intent private NdefMessage[] getNdefMessages(Intent intent) { NdefMessage[] msgs = null; String action = intent.getAction(); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } else { byte[] empty = new byte[] {}; NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty); NdefMessage msg = new NdefMessage(new NdefRecord[] { record }); msgs = new NdefMessage[] {msg}; } } else { Log.d(TAG, "Unknown intent."); finish(); } return msgs; }Cuối cùng thêm permission để cho phép ứng dụng sử dụng NFC <uses-permission android:name="android.permission.NFC" />Và thêm IntentFilter cho lớp StickyNotesActivity để lọc hành động gửi NDEF message: <activity android:name=".StickyNotesActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> 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> activity>
Một số hình ảnh DEMO: Phần tiếp theo: Part 2: Write NFC tags (Sử dụng Android devices để ghi dữ liệu trên tag NFC) Tham khảo: |