Tài liệu này mô tả các tác vụ NFC cơ bản mà bạn thực hiện trong Android. Hướng dẫn này giải thích cách gửi và nhận dữ liệu NFC dưới dạng thông báo NDEF và mô tả các API khung Android hỗ trợ các tính năng này. Đối với các chủ đề nâng cao hơn, bao gồm cả nội dung thảo luận về cách làm việc với dữ liệu không phải của NDEF, hãy xem phần NFC nâng cao.
Có hai trường hợp sử dụng chính khi làm việc với dữ liệu NDEF và Android:
- Đọc dữ liệu NDEF từ thẻ NFC
- Chiếu thông báo NDEF từ thiết bị này sang thiết bị khác bằng Android BeamTM
Việc đọc dữ liệu NDEF từ thẻ NFC được xử lý bằng lệnh gửi thẻ system giúp phân tích các thẻ NFC đã phát hiện, phân loại dữ liệu thích hợp và bắt đầu một ứng dụng quan tâm đến dữ liệu được phân loại. Một ứng dụng muốn xử lý thẻ NFC đã quét có thể khai báo bộ lọc ý định và xử lý dữ liệu.
Tính năng Android BeamTM cho phép thiết bị đẩy thông báo NDEF lên một thiết bị khác bằng cách chạm vật lý vào các thiết bị. Hoạt động tương tác này giúp bạn để gửi dữ liệu ngoài các công nghệ không dây khác như Bluetooth, vì có NFC, không có thiết bị thủ công hoặc ghép nối. Kết nối sẽ tự động bắt đầu khi có 2 thiết bị thành phạm vi. Android Beam được cung cấp thông qua một bộ API NFC, vì vậy, bất kỳ ứng dụng nào cũng có thể truyền thông tin giữa các thiết bị. Ví dụ: các ứng dụng Danh bạ, Trình duyệt và YouTube sử dụng Truyền tia Android để chia sẻ danh bạ, trang web và video với các thiết bị khác.
Hệ thống phân phối thẻ
Các thiết bị chạy Android thường tìm thẻ NFC khi màn hình được mở khoá, trừ phi NFC bị tắt trong trình đơn Cài đặt của thiết bị. Khi thiết bị chạy Android phát hiện ra một thẻ NFC, hành vi mong muốn là hoạt động thích hợp nhất để xử lý ý định mà không cần hỏi người dùng về ứng dụng nào để sử dụng. Do thiết bị quét thẻ NFC ở phạm vi rất ngắn, nên có nhiều khả năng người dùng sẽ hãy chọn một hoạt động sẽ buộc họ di chuyển thiết bị ra xa thẻ và ngắt kết nối. Bạn nên phát triển hoạt động của mình để chỉ xử lý các thẻ NFC mà hoạt động của bạn quan tâm ngăn Trình chọn hoạt động xuất hiện.
Để giúp bạn đạt được mục tiêu này, Android cung cấp một hệ thống phân phối thẻ đặc biệt giúp phân tích các thẻ đã quét Thẻ NFC, phân tích cú pháp các thẻ và cố gắng xác định vị trí các ứng dụng quan tâm đến dữ liệu đã quét. Nó thực hiện việc này bằng cách:
- Phân tích cú pháp thẻ NFC và xác định loại MIME hoặc URI xác định tải trọng dữ liệu trong thẻ.
- Đóng gói loại MIME hoặc URI và tải trọng vào một ý định. Hai đường dẫn đầu tiên này bước này được mô tả trong phần Cách ánh xạ thẻ NFC với các loại MIME và URI.
- Bắt đầu một hoạt động dựa trên ý định. Điều này được mô tả trong Cách thẻ NFC được gửi đến ứng dụng.
Cách liên kết thẻ NFC với các loại MIME và URI
Trước khi bắt đầu viết ứng dụng NFC, điều quan trọng là bạn phải hiểu các các loại thẻ NFC, cách hệ thống gửi thẻ phân tích cú pháp thẻ NFC và chức năng đặc biệt của thẻ khi phát hiện thông báo NDEF. Thẻ NFC có rất nhiều công nghệ và cũng có thể ghi dữ liệu vào chúng theo nhiều cách. Android hỗ trợ nhiều nhất tiêu chuẩn NDEF mà Diễn đàn NFC xác định.
Dữ liệu NDEF được đóng gói bên trong một thông điệp (NdefMessage
) có chứa một
hoặc nhiều bản ghi (NdefRecord
). Mỗi bản ghi NDEF phải được định dạng đúng theo
thông tin đặc tả của loại bản ghi mà bạn muốn tạo. của Android
cũng hỗ trợ các loại thẻ khác không chứa dữ liệu NDEF mà bạn có thể xử lý bằng cách sử dụng
các lớp trong gói android.nfc.tech
. Để tìm hiểu thêm
về các công nghệ này, hãy xem chủ đề NFC nâng cao. Làm việc với các loại thẻ khác này bao gồm
tự viết ngăn xếp giao thức để giao tiếp với thẻ, vì vậy bạn nên sử dụng NDEF khi
có thể giúp dễ dàng phát triển và hỗ trợ tối đa cho các thiết bị chạy Android.
Lưu ý: Để tải toàn bộ thông số kỹ thuật NDEF xuống, hãy chuyển đến phần Thông số kỹ thuật của Diễn đàn về NFC & trang web Tài liệu đăng ký và xem Tạo các loại bản ghi NDEF phổ biến để tham khảo ví dụ về cách tạo bản ghi NDEF.
Giờ đây, bạn đã có một số thông tin cơ bản về thẻ NFC, các phần sau đây sẽ mô tả chi tiết hơn về cách
Android xử lý các thẻ có định dạng NDEF. Khi thiết bị chạy Android quét thẻ NFC có chứa NDEF
dữ liệu được định dạng, nó sẽ phân tích cú pháp thông báo và cố gắng tìm ra loại MIME của dữ liệu hoặc nhận dạng
URI. Để thực hiện việc này, hệ thống sẽ đọc NdefRecord
đầu tiên bên trong NdefMessage
để xác định cách diễn giải toàn bộ thông báo NDEF (thông báo NDEF có thể
có nhiều bản ghi NDEF). Trong một thông báo NDEF được định dạng đúng, NdefRecord
đầu tiên
chứa các trường sau:
- TNF 3 bit (Định dạng tên loại)
- Cho biết cách diễn giải trường loại độ dài biến thiên. Các giá trị hợp lệ là được mô tả trong Bảng 1.
- Loại độ dài có thể thay đổi
- Mô tả loại bản ghi. Nếu sử dụng
TNF_WELL_KNOWN
, hãy sử dụng trường này để chỉ định Định nghĩa loại bản ghi (RTD). Các giá trị RTD hợp lệ được mô tả trong Bảng 2. - Mã độ dài có thể thay đổi
- Giá trị nhận dạng duy nhất của bản ghi. Trường này không được sử dụng thường xuyên, nhưng nếu cần xác định duy nhất một thẻ, bạn có thể tạo mã nhận dạng cho thẻ đó.
- Tải trọng có chiều dài thay đổi
- Tải trọng dữ liệu thực tế mà bạn muốn đọc hoặc ghi. NDEF thông báo có thể chứa nhiều bản ghi NDEF, vì vậy, đừng giả định toàn bộ tải trọng nằm trong NDEF đầu tiên bản ghi của thông báo NDEF.
Hệ thống phân phối thẻ sử dụng các trường loại và TNF để cố gắng ánh xạ một loại MIME hoặc URI đến loại
Thông báo NDEF. Nếu thành công, mô-đun này sẽ đóng gói thông tin đó bên trong ý định ACTION_NDEF_DISCOVERED
cùng với tải trọng thực tế. Tuy nhiên, có
là những trường hợp mà hệ thống điều phối thẻ không thể xác định loại dữ liệu dựa trên NDEF đầu tiên
ghi lại. Điều này xảy ra khi không thể ánh xạ dữ liệu NDEF tới một loại MIME hay URI hoặc khi
Để bắt đầu, thẻ NFC không chứa dữ liệu NDEF. Trong những trường hợp như vậy, đối tượng Tag
có thông tin về công nghệ của thẻ và tải trọng sẽ
được gói gọn bên trong ý định ACTION_TECH_DISCOVERED
.
Bảng 1 mô tả cách hệ thống điều phối thẻ liên kết TNF và loại
sang loại MIME hoặc URI. Hướng dẫn này cũng mô tả những TNF không thể ánh xạ tới một loại MIME hoặc URI.
Trong những trường hợp này, hệ thống phân phối thẻ sẽ quay lại sử dụng
ACTION_TECH_DISCOVERED
.
Ví dụ: nếu hệ thống điều phối thẻ gặp một bản ghi thuộc loại TNF_ABSOLUTE_URI
, thì hệ thống sẽ ánh xạ trường loại độ dài biến của bản ghi đó
vào một URI. Hệ thống điều phối thẻ sẽ đóng gói URI đó trong trường dữ liệu của ý định ACTION_NDEF_DISCOVERED
cùng với các thông tin khác về thẻ,
chẳng hạn như tải trọng. Mặt khác, nếu gặp một bản ghi thuộc loại TNF_UNKNOWN
, thẻ này sẽ tạo một ý định đóng gói các công nghệ của thẻ
thay thế.
Định dạng tên loại (TNF) | Liên kết |
---|---|
TNF_ABSOLUTE_URI |
URI dựa trên trường loại. |
TNF_EMPTY |
Trở về ACTION_TECH_DISCOVERED . |
TNF_EXTERNAL_TYPE |
URI dựa trên URN trong trường loại. URN được mã hoá thành trường loại NDEF trong
biểu mẫu rút gọn: <domain_name>:<service_name> .
Android ánh xạ dữ liệu này đến một URI ở dạng:
vnd.android.nfc://ext/<domain_name>:<service_name> . |
TNF_MIME_MEDIA |
Loại MIME dựa trên trường loại. |
TNF_UNCHANGED |
Không hợp lệ trong bản ghi đầu tiên, do đó hãy quay lại
ACTION_TECH_DISCOVERED . |
TNF_UNKNOWN |
Trở về ACTION_TECH_DISCOVERED . |
TNF_WELL_KNOWN |
Loại MIME hoặc URI tuỳ thuộc vào Định nghĩa loại bản ghi (RTD) mà bạn đặt trong trường nhập. Xem Bảng 2 để biết thêm thông tin về các RTD có sẵn và mối liên kết của chúng. |
Định nghĩa loại bản ghi (RTD) | Liên kết |
---|---|
RTD_ALTERNATIVE_CARRIER |
Trở về ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_CARRIER |
Trở về ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_REQUEST |
Trở về ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_SELECT |
Trở về ACTION_TECH_DISCOVERED . |
RTD_SMART_POSTER |
URI dựa trên việc phân tích cú pháp tải trọng. |
RTD_TEXT |
Loại MIME là text/plain . |
RTD_URI |
URI dựa trên tải trọng. |
Cách thẻ NFC được gửi đến ứng dụng
Khi hệ thống phân phối thẻ hoàn tất, hãy tạo một ý định đóng gói thẻ NFC và thông tin nhận dạng, nó sẽ gửi ý định đến một ứng dụng quan tâm cho ý định. Nếu có nhiều ứng dụng có thể xử lý ý định này, thì Trình chọn hoạt động sẽ được hiển thị để người dùng có thể chọn Hoạt động. Hệ thống phân phối thẻ xác định 3 ý định: được liệt kê theo thứ tự ưu tiên từ cao nhất đến thấp nhất:
-
ACTION_NDEF_DISCOVERED
: Ý định này được dùng để bắt đầu một Hoạt động khi một thẻ chứa tải trọng NDEF được quét và thuộc loại được nhận dạng. Đây là ý định ưu tiên cao nhất và hệ thống phân phối thẻ cố gắng bắt đầu một Hoạt động bằng ý định này ý định trước bất kỳ ý định nào khác, bất cứ khi nào có thể. ACTION_TECH_DISCOVERED
: Nếu không có hoạt động nào đăng ký xử lýACTION_NDEF_DISCOVERED
ý định, hệ thống điều phối thẻ sẽ cố gắng khởi động một ứng dụng với ý định này. Chiến dịch này ý định cũng được bắt đầu trực tiếp (mà không bắt đầu trướcACTION_NDEF_DISCOVERED
) nếu thẻ được quét chứa dữ liệu NDEF không thể ánh xạ tới một loại MIME hoặc URI, hoặc nếu thẻ không chứa NDEF nhưng là công nghệ thẻ đã biết.ACTION_TAG_DISCOVERED
: Ý định này đã được bắt đầu nếu không có hoạt động nào xử lýACTION_NDEF_DISCOVERED
hoặcACTION_TECH_DISCOVERED
ý định.
Sau đây là cách cơ bản của hệ thống phân phối thẻ:
- Thử bắt đầu một Hoạt động bằng ý định do hệ thống điều phối thẻ tạo ra
khi phân tích cú pháp thẻ NFC (
ACTION_NDEF_DISCOVERED
hoặcACTION_TECH_DISCOVERED
). - Nếu không có hoạt động nào lọc cho ý định đó, hãy thử bắt đầu một Hoạt động bằng
ý định ưu tiên thấp nhất (
ACTION_TECH_DISCOVERED
hoặcACTION_TAG_DISCOVERED
) cho đến khi một ứng dụng lọc cho ý định hoặc cho đến khi hệ thống phân phối thẻ thử tất cả các ý định có thể có. - Nếu không có ứng dụng nào lọc ý định, thì bạn không cần làm gì cả.
Bất cứ khi nào có thể, hãy xử lý thông báo NDEF và ý định ACTION_NDEF_DISCOVERED
, vì ý định này là cụ thể nhất trong số
ba. Ý định này cho phép bạn khởi động ứng dụng của mình tại thời điểm thích hợp hơn so với
hai ý định khác, giúp người dùng
có trải nghiệm tốt hơn.
Yêu cầu quyền truy cập NFC trong tệp kê khai Android
Trước khi bạn có thể truy cập phần cứng NFC của thiết bị và xử lý đúng cách các ý định NFC, hãy khai báo những
mục trong tệp AndroidManifest.xml
của bạn:
- Phần tử
<uses-permission>
NFC để truy cập phần cứng NFC:<uses-permission android:name="android.permission.NFC" />
- Phiên bản SDK tối thiểu mà ứng dụng của bạn có thể hỗ trợ. Chỉ hỗ trợ API cấp 9
gửi thẻ bị giới hạn qua
ACTION_TAG_DISCOVERED
và chỉ cung cấp quyền truy cập vào thông báo NDEF quaEXTRA_NDEF_MESSAGES
bổ sung. Không các thuộc tính thẻ khác hoặc thao tác I/O. API cấp 10 bao gồm dịch vụ hỗ trợ toàn diện cho độc giả/người ghi cũng như tính năng đẩy NDEF trên nền trước và cấp độ API 14 mang đến cách dễ dàng hơn để đẩy thông báo NDEF đến các thiết bị khác bằng tính năng Truyền tia Android và nhiều tính năng khác để tạo bản ghi NDEF.<uses-sdk android:minSdkVersion="10"/>
- Phần tử
uses-feature
để ứng dụng của bạn xuất hiện trong Google Play chỉ dành cho các thiết bị có phần cứng NFC:<uses-feature android:name="android.hardware.nfc" android:required="true" />
Nếu ứng dụng của bạn sử dụng chức năng NFC nhưng chức năng đó không quan trọng đối với bạn có thể bỏ qua phần tử
uses-feature
và kiểm tra tính sẵn có của NFC tại bằng cách kiểm tra xem liệugetDefaultAdapter()
lànull
.
Bộ lọc cho ý định NFC
Để khởi động ứng dụng của bạn khi thẻ NFC mà bạn muốn xử lý được quét, ứng dụng của bạn
có thể lọc một, hai hoặc cả ba ý định NFC trong tệp kê khai Android. Tuy nhiên, bạn
thường muốn lọc ý định ACTION_NDEF_DISCOVERED
cho
kiểm soát nhiều nhất thời điểm khởi động ứng dụng. Ý định ACTION_TECH_DISCOVERED
là phương án dự phòng cho ACTION_NDEF_DISCOVERED
khi không có ứng dụng nào lọc
ACTION_NDEF_DISCOVERED
hoặc khi tải trọng không phải là
NDEF. Quá trình lọc cho ACTION_TAG_DISCOVERED
thường quá chung chung
danh mục để lọc. Nhiều ứng dụng sẽ lọc ACTION_NDEF_DISCOVERED
hoặc ACTION_TECH_DISCOVERED
trước ACTION_TAG_DISCOVERED
, vì vậy, ứng dụng của bạn có xác suất thấp
bắt đầu. ACTION_TAG_DISCOVERED
chỉ có thể chọn làm phương án cuối cùng
cho các ứng dụng để lọc trong trường hợp không có ứng dụng nào khác được cài đặt để xử lý
Ý định ACTION_NDEF_DISCOVERED
hoặc ACTION_TECH_DISCOVERED
.
Do quy trình triển khai thẻ NFC là khác nhau và nhiều lần không thuộc quyền kiểm soát của bạn, nên việc này không phải lúc nào cũng diễn ra đó là lý do tại sao bạn có thể dự phòng cho 2 ý định còn lại khi cần thiết. Khi bạn có kiểm soát các loại thẻ và dữ liệu được ghi, bạn nên sử dụng NDEF để định dạng các thẻ. Các phần sau đây mô tả cách lọc theo từng loại ý định.
ACTION_NDEF_KHÁM PHÁ
Để lọc ý định ACTION_NDEF_DISCOVERED
, hãy khai báo
bộ lọc ý định cùng với loại dữ liệu bạn muốn lọc. Chiến lược phát hành đĩa đơn
các bộ lọc ví dụ sau cho ACTION_NDEF_DISCOVERED
ý định có loại MIME là text/plain
:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> </intent-filter>
Các bộ lọc mẫu sau đây cho URI ở dạng
https://developer.android.com/index.html
.
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
ACTION_TECH_KHÁM PHÁ
Nếu hoạt động của bạn lọc cho ý định ACTION_TECH_DISCOVERED
,
bạn phải tạo tệp tài nguyên XML chỉ định các công nghệ mà hoạt động của bạn hỗ trợ
trong tập hợp tech-list
. Hoạt động của bạn là
được coi là kết quả trùng khớp nếu tập tech-list
là một tập con các công nghệ được
được thẻ hỗ trợ mà bạn có thể nhận được bằng cách gọi getTechList()
.
Ví dụ: nếu thẻ được quét hỗ trợ MifareClassic, NdefFormatable và NfcA,
Nhóm tech-list
phải chỉ định cả 3, 2 hoặc một trong số các công nghệ (và không có gì
else) để so khớp hoạt động của bạn.
Mẫu sau đây xác định tất cả các công nghệ. Bạn phải xoá những trang không được
được thẻ NFC hỗ trợ. Lưu tệp này (bạn có thể đặt bất kỳ tên nào bạn muốn) trong
<project-root>/res/xml
thư mục.
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech> <tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech> </tech-list> </resources>
Bạn cũng có thể chỉ định nhiều tập hợp tech-list
. Từng tech-list
các tập hợp được xem xét độc lập và hoạt động của bạn được coi là phù hợp nếu có bất kỳ
Tập hợp tech-list
là một tập hợp con các công nghệ được getTechList()
trả về. Thao tác này cung cấp AND
và OR
ngữ nghĩa cho công nghệ so khớp. Ví dụ sau đây so khớp các thẻ có thể hỗ trợ
Công nghệ NfcA và Ndef hoặc có thể hỗ trợ công nghệ NfcB và Ndef:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
Trong tệp AndroidManifest.xml
, hãy chỉ định tệp tài nguyên mà bạn vừa tạo
trong phần tử <meta-data>
bên trong <activity>
như trong ví dụ sau:
<activity> ... <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> ... </activity>
Để biết thêm thông tin về cách làm việc với các công nghệ thẻ và ý định ACTION_TECH_DISCOVERED
, hãy xem bài viết Làm việc với thẻ được hỗ trợ
Các công nghệ trong tài liệu NFC nâng cao.
ACTION_TAG_KHÁM PHÁ
Để lọc ACTION_TAG_DISCOVERED
, hãy sử dụng ý định sau
lọc:
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
Lấy thông tin từ ý định
Nếu một hoạt động bắt đầu do ý định NFC, bạn có thể lấy thông tin về NFC đã quét thẻ khỏi ý định. Ý định có thể chứa các phần bổ sung sau đây, tuỳ thuộc vào thẻ đã được quét:
EXTRA_TAG
(bắt buộc): Đối tượngTag
đại diện cho thẻ đã quét.EXTRA_NDEF_MESSAGES
(không bắt buộc): Một mảng thông báo NDEF được phân tích cú pháp từ thẻ. Phần bổ sung này là bắt buộc đối vớiACTION_NDEF_DISCOVERED
ý định.EXTRA_ID
(không bắt buộc): Mã nhận dạng cấp thấp của thẻ.
Để nhận được các ứng dụng bổ sung này, hãy kiểm tra xem hoạt động của bạn có được chạy bằng một trong
ý định NFC để đảm bảo rằng thẻ đã được quét, sau đó lấy phần bổ sung từ
ý định. Các ví dụ sau đây sẽ kiểm tra ACTION_NDEF_DISCOVERED
ý định và nhận thông báo NDEF qua một ý định bổ sung.
Kotlin
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) ... if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages -> val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage } // Process the messages array. ... } } }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); ... if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMessages != null) { NdefMessage[] messages = new NdefMessage[rawMessages.length]; for (int i = 0; i < rawMessages.length; i++) { messages[i] = (NdefMessage) rawMessages[i]; } // Process the messages array. ... } } }
Ngoài ra, bạn có thể lấy đối tượng Tag
qua ý định. Ý định này sẽ
chứa tải trọng và cho phép bạn liệt kê các công nghệ của thẻ:
Kotlin
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
Java
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Tạo các loại bản ghi NDEF phổ biến
Phần này mô tả cách tạo các loại bản ghi NDEF phổ biến để hỗ trợ bạn khi ghi dữ liệu
Thẻ NFC hoặc gửi dữ liệu bằng tính năng Truyền tia Android. Kể từ Android 4.0 (API cấp 14),
Bạn có thể dùng createUri()
phương thức để tạo
URI tự động ghi lại. Kể từ Android 4.1 (API cấp 16),
createExternal()
và createMime()
luôn sẵn sàng giúp bạn tạo
Bản ghi MIME và NDEF loại bên ngoài. Sử dụng các phương thức trợ giúp này bất cứ khi nào có thể để tránh sai sót
khi tạo bản ghi NDEF theo cách thủ công.
Phần này cũng mô tả cách tạo bộ lọc ý định cho bản ghi. Tất cả các ví dụ về bản ghi NDEF phải nằm trong NDEF đầu tiên bản ghi của thông báo NDEF mà bạn đang ghi vào thẻ hoặc hệ thống chiếu.
TNF_ABSOLUTE_URI
Lưu ý:Bạn nên sử dụng
Nhập RTD_URI
TNF_ABSOLUTE_URI
, vì nó hiệu quả hơn.
Bạn có thể tạo bản ghi NDEF TNF_ABSOLUTE_URI
theo cách sau
:
Kotlin
val uriRecord = ByteArray(0).let { emptyByteArray -> NdefRecord( TNF_ABSOLUTE_URI, "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")), emptyByteArray, emptyByteArray ) }
Java
NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]);
Bộ lọc ý định cho bản ghi NDEF trước đó sẽ có dạng như sau:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
TNF_MIME_MEDIA
Bạn có thể tạo bản ghi NDEF TNF_MIME_MEDIA
theo những cách sau:
Sử dụng phương thức createMime()
:
Kotlin
val mimeRecord = NdefRecord.createMime( "application/vnd.com.example.android.beam", "Beam me up, Android".toByteArray(Charset.forName("US-ASCII")) )
Java
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam", "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
Tạo NdefRecord
theo cách thủ công:
Kotlin
val mimeRecord = Charset.forName("US-ASCII").let { usAscii -> NdefRecord( NdefRecord.TNF_MIME_MEDIA, "application/vnd.com.example.android.beam".toByteArray(usAscii), ByteArray(0), "Beam me up, Android!".toByteArray(usAscii) ) }
Java
NdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")), new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
Bộ lọc ý định cho bản ghi NDEF trước đó sẽ có dạng như sau:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example.android.beam" /> </intent-filter>
TNF_WELL_KNOWN với RTD_TEXT
Bạn có thể tạo bản ghi NDEF TNF_WELL_KNOWN
theo cách sau:
Kotlin
fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord { val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII")) val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16") val textBytes = payload.toByteArray(utfEncoding) val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7 val status = (utfBit + langBytes.size).toChar() val data = ByteArray(1 + langBytes.size + textBytes.size) data[0] = status.toByte() System.arraycopy(langBytes, 0, data, 1, langBytes.size) System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size) return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data) }
Java
public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) { byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16"); byte[] textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); return record; }
Bộ lọc ý định cho bản ghi NDEF trước đó sẽ có dạng như sau:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
TNF_WELL_KNOWN với RTD_URI
Bạn có thể tạo bản ghi NDEF TNF_WELL_KNOWN
theo những cách sau:
Sử dụng phương thức createUri(String)
:
Kotlin
val rtdUriRecord1 = NdefRecord.createUri("https://example.com")
Java
NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");
Sử dụng phương thức createUri(Uri)
:
Kotlin
val rtdUriRecord2 = Uri.parse("https://example.com").let { uri -> NdefRecord.createUri(uri) }
Java
Uri uri = Uri.parse("https://example.com"); NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
Tạo NdefRecord
theo cách thủ công:
Kotlin
val uriField = "example.com".toByteArray(Charset.forName("US-ASCII")) val payload = ByteArray(uriField.size + 1) //add 1 for the URI Prefix payload [0] = 0x01 //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.size) //appends URI to payload val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload)
Java
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII")); byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix payload[0] = 0x01; //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload NdefRecord rtdUriRecord = new NdefRecord( NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
Bộ lọc ý định cho bản ghi NDEF trước đó sẽ có dạng như sau:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="example.com" android:pathPrefix="" /> </intent-filter>
TNF_EXTERNAL_TYPE
Bạn có thể tạo bản ghi NDEF TNF_EXTERNAL_TYPE
trong các lệnh sau
cách:
Sử dụng phương thức createExternal()
:
Kotlin
var payload: ByteArray //assign to your data val domain = "com.example" //usually your app's package name val type = "externalType" val extRecord = NdefRecord.createExternal(domain, type, payload)
Java
byte[] payload; //assign to your data String domain = "com.example"; //usually your app's package name String type = "externalType"; NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);
Tạo NdefRecord
theo cách thủ công:
Kotlin
var payload: ByteArray ... val extRecord = NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".toByteArray(Charset.forName("US-ASCII")), ByteArray(0), payload )
Java
byte[] payload; ... NdefRecord extRecord = new NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")), new byte[0], payload);
Bộ lọc ý định cho bản ghi NDEF trước đó sẽ có dạng như sau:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="vnd.android.nfc" android:host="ext" android:pathPrefix="/com.example:externalType"/> </intent-filter>
Sử dụng TNF_EXTERNAL_TYPE
để triển khai thẻ NFC chung nhằm hỗ trợ tốt hơn cho cả hai
Thiết bị chạy Android và thiết bị không chạy Android.
Lưu ý: URN cho TNF_EXTERNAL_TYPE
có định dạng chuẩn là:
urn:nfc:ext:example.com:externalType
, tuy nhiên, thông số kỹ thuật RTD của Diễn đàn NFC
khai báo rằng phần urn:nfc:ext:
của URN phải được bỏ khỏi
Bản ghi NDEF. Vì vậy, bạn chỉ cần cung cấp miền (trong ví dụ là example.com
)
và loại (trong ví dụ này là externalType
) được phân tách bằng dấu hai chấm.
Khi điều phối TNF_EXTERNAL_TYPE
, Android sẽ chuyển đổi URN urn:nfc:ext:example.com:externalType
thành URI vnd.android.nfc://ext/example.com:externalType
. Đây là URI mà
bộ lọc ý định trong ví dụ này sẽ khai báo.
Bản ghi ứng dụng Android
Ra mắt trong Android 4.0 (API cấp 14), Bản ghi ứng dụng Android (AAR) cung cấp tính năng sự chắc chắn rằng ứng dụng của bạn sẽ được khởi động khi thẻ NFC được quét. Một AAR có tên gói của một ứng dụng được nhúng bên trong bản ghi NDEF. Bạn có thể thêm AAR vào bất kỳ bản ghi NDEF nào của NDEF vì Android tìm kiếm toàn bộ thông báo NDEF cho AAR. Nếu tìm thấy AAR, nó sẽ khởi động ứng dụng dựa trên tên gói trong AAR. Nếu ứng dụng không có trên thiết bị, khởi chạy Google Play để tải ứng dụng xuống.
AAR rất hữu ích nếu bạn muốn ngăn các ứng dụng khác lọc có cùng ý định và có thể xử lý các thẻ cụ thể mà bạn đã triển khai. AAR chỉ được hỗ trợ ở cấp ứng dụng, do ràng buộc tên gói và không phải ở cấp Hoạt động như với lọc ý định. Nếu bạn muốn xử lý một ý định ở cấp Hoạt động, hãy sử dụng bộ lọc ý định.
Nếu một thẻ chứa AAR, thì hệ thống điều phối thẻ sẽ được gửi theo cách sau:
- Thử bắt đầu một Hoạt động bằng bộ lọc ý định như bình thường. Nếu Hoạt động khớp với ý định cũng khớp với AAR, hãy bắt đầu Hoạt động.
- Nếu Hoạt động lọc ý định không khớp với AAR, nếu nhiều Hoạt động có thể xử lý ý định hoặc nếu không có Hoạt động nào xử lý ý định, hãy bắt đầu do AAR chỉ định.
- Nếu không có ứng dụng nào có thể khởi động bằng AAR, hãy truy cập Google Play để tải xuống dựa trên AAR.
Lưu ý: Bạn có thể ghi đè AAR và hệ thống phân phối ý định bằng nền trước hệ thống điều phối, cho phép một hoạt động trên nền trước được ưu tiên khi thẻ NFC được phát hiện. Với phương pháp này, hoạt động phải chạy ở nền trước để ghi đè AAR và hệ thống phân phối ý định.
Nếu vẫn muốn lọc tìm các thẻ đã quét không chứa AAR, bạn có thể khai báo như bình thường. Điều này rất hữu ích nếu ứng dụng của bạn quan tâm đến các thẻ khác không chứa AAR. Ví dụ: có thể bạn muốn đảm bảo rằng ứng dụng của mình xử lý các thẻ độc quyền mà bạn triển khai cũng như các thẻ chung do bên thứ ba triển khai. Lưu ý AAR là dành riêng cho các thiết bị Android 4.0 trở lên, vì vậy khi triển khai thẻ, có thể bạn sẽ muốn để sử dụng kết hợp các loại/URI/AAR và MIME nhằm hỗ trợ nhiều thiết bị nhất. Trong ngoài ra, khi bạn triển khai thẻ NFC, hãy suy nghĩ về cách bạn muốn ghi thẻ NFC để bật hỗ trợ cho hầu hết các thiết bị (cài đặt Android và các thiết bị khác). Bạn có thể thực hiện việc này bằng cách xác định loại MIME hoặc URI tương đối duy nhất để giúp ứng dụng dễ phân biệt hơn.
Android cung cấp một API đơn giản để tạo AAR,
createApplicationRecord()
. Tất cả những gì bạn cần
cần nhúng AAR vào bất cứ đâu trong NdefMessage
. Bạn không muốn
để sử dụng bản ghi đầu tiên của NdefMessage
, trừ phi AAR là bản ghi duy nhất
ghi trong NdefMessage
. Điều này là do Android
hệ thống kiểm tra bản ghi đầu tiên của NdefMessage
để xác định loại MIME hoặc
URI của thẻ, dùng để tạo ý định cho các ứng dụng lọc. Mã sau đây
hướng dẫn bạn cách tạo AAR:
Kotlin
val msg = NdefMessage( arrayOf( ..., NdefRecord.createApplicationRecord("com.example.android.beam") ) )
Java
NdefMessage msg = new NdefMessage( new NdefRecord[] { ..., NdefRecord.createApplicationRecord("com.example.android.beam")} ); )
Chiếu thông báo NDEF tới các thiết bị khác
Android Beam cho phép trao đổi dữ liệu ngang hàng đơn giản giữa hai thiết bị chạy Android. Chiến lược phát hành đĩa đơn ứng dụng muốn truyền dữ liệu tới một thiết bị khác phải ở nền trước và thiết bị nhận dữ liệu không bị khoá. Khi thiết bị chiếu sáng tiếp xúc đủ gần với thiết bị chiếu, thiết bị chiếu sáng sẽ hiển thị thông báo "Chạm để chiếu" Giao diện người dùng. Sau đó, người dùng có thể chọn có truyền thông báo tới thiết bị nhận hay không.
Lưu ý: Công nghệ đẩy NDEF trên nền trước hiện có ở API cấp 10,
cung cấp chức năng tương tự như Android Beam. Các API này không còn được sử dụng nữa, nhưng
có sẵn để hỗ trợ các thiết bị cũ. Hãy xem enableForegroundNdefPush()
để biết thêm thông tin.
Bạn có thể bật Android Beam cho ứng dụng của mình bằng cách gọi một trong hai phương thức:
setNdefPushMessage()
: Chấp nhận mộtNdefMessage
để đặt làm thông báo sẽ chiếu. Tự động chiếu tin nhắn khi 2 thiết bị ở trong khoảng cách đủ gần.setNdefPushMessageCallback()
: Chấp nhận lệnh gọi lại chứacreateNdefMessage()
được gọi khi thiết bị nằm trong phạm vi để truyền dữ liệu tới. Lệnh gọi lại cho phép bạn tạo thông báo NDEF chỉ khi cần.
Một hoạt động chỉ có thể đẩy một thông báo NDEF tại mỗi thời điểm, nên setNdefPushMessageCallback()
sẽ được ưu tiên
trên setNdefPushMessage()
nếu cả hai đều được đặt. Để sử dụng
Android Stream, thì phải đáp ứng các nguyên tắc chung sau:
- Hoạt động đang chiếu dữ liệu phải ở nền trước. Cả hai thiết bị đều phải có màn hình của họ đã mở khoá.
- Bạn phải đóng gói dữ liệu mà bạn đang chiếu trong
NdefMessage
. - Thiết bị NFC đang nhận dữ liệu được chiếu phải hỗ trợ
Giao thức đẩy
com.android.npp
NDEF hoặc SNEP của Diễn đàn NFC (Trao đổi NDEF đơn giản) Giao thức). Bạn phải có giao thứccom.android.npp
cho các thiết bị dùng API cấp 9 (Android 2.3) đến API cấp 13 (Android 3.2).com.android.npp
và SNEP đều bắt buộc trên API cấp 14 (Android 4.0) trở lên.
Lưu ý: Nếu hoạt động của bạn bật tính năng Truyền tia Android và đang ở nền trước, hệ thống điều phối ý định chuẩn sẽ bị tắt. Tuy nhiên, nếu hoạt động của bạn cũng bật điều phối trên nền trước, thì dịch vụ này vẫn có thể quét các thẻ khớp với bộ lọc ý định đã đặt trong điều phối trên nền trước.
Để bật tính năng Truyền tia Android:
- Tạo một
NdefMessage
chứa cácNdefRecord
mà bạn muốn đẩy lên thiết bị kia. - Gọi
setNdefPushMessage()
bằngNdefMessage
hoặc gọisetNdefPushMessageCallback
truyền vào đối tượngNfcAdapter.CreateNdefMessageCallback
trong phương thứconCreate()
của hoạt động của bạn. Các phương thức này yêu cầu ít nhất một hoạt động mà bạn muốn bật trong Android Tia, cùng với danh sách các hoạt động tuỳ chọn khác để kích hoạt.Nhìn chung, bạn thường dùng
setNdefPushMessage()
nếu Hoạt động của bạn chỉ cần luôn đẩy cùng một thông báo NDEF khi hai thiết bị nằm trong phạm vi để giao tiếp. Bạn sử dụngsetNdefPushMessageCallback
khi ứng dụng quan tâm đến ngữ cảnh hiện tại của ứng dụng và muốn đẩy một thông báo NDEF tuỳ thuộc vào thao tác của người dùng trong ứng dụng.
Mẫu sau đây cho thấy cách một hoạt động đơn giản gọi NfcAdapter.CreateNdefMessageCallback
trong phương thức onCreate()
của một
hoạt động (xem AndroidBeamdemo
cho mẫu hoàn chỉnh). Ví dụ này cũng có các phương thức giúp bạn tạo bản ghi MIME:
Kotlin
package com.example.android.beam import android.app.Activity import android.content.Intent import android.nfc.NdefMessage import android.nfc.NdefRecord import android.nfc.NfcAdapter import android.nfc.NfcAdapter.CreateNdefMessageCallback import android.nfc.NfcEvent import android.os.Bundle import android.os.Parcelable import android.widget.TextView import android.widget.Toast import java.nio.charset.Charset class Beam : Activity(), NfcAdapter.CreateNdefMessageCallback { private var nfcAdapter: NfcAdapter? = null private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) textView = findViewById(R.id.textView) // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this) if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show() finish() return } // Register callback nfcAdapter?.setNdefPushMessageCallback(this, this) } override fun createNdefMessage(event: NfcEvent): NdefMessage { val text = "Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis() return NdefMessage( arrayOf( createMime("application/vnd.com.example.android.beam", text.toByteArray()) ) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. *///,NdefRecord.createApplicationRecord("com.example.android.beam") ) } override fun onResume() { super.onResume() // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { processIntent(intent) } } override fun onNewIntent(intent: Intent) { // onResume gets called after this to handle the intent setIntent(intent) } /** * Parses the NDEF Message from the intent and prints to the TextView */ private fun processIntent(intent: Intent) { textView = findViewById(R.id.textView) // only one message sent during the beam intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMsgs -> (rawMsgs[0] as NdefMessage).apply { // record 0 contains the MIME type, record 1 is the AAR, if present textView.text = String(records[0].payload) } } } }
Java
package com.example.android.beam; import android.app.Activity; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; import android.nfc.NfcEvent; import android.os.Bundle; import android.os.Parcelable; import android.widget.TextView; import android.widget.Toast; import java.nio.charset.Charset; public class Beam extends Activity implements CreateNdefMessageCallback { NfcAdapter nfcAdapter; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show(); finish(); return; } // Register callback nfcAdapter.setNdefPushMessageCallback(this, this); } @Override public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis()); NdefMessage msg = new NdefMessage( new NdefRecord[] { createMime( "application/vnd.com.example.android.beam", text.getBytes()) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. */ //,NdefRecord.createApplicationRecord("com.example.android.beam") }); return msg; } @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { textView = (TextView) findViewById(R.id.textView); Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present textView.setText(new String(msg.getRecords()[0].getPayload())); } }
Xin lưu ý rằng mã này nhận xét một AAR mà bạn có thể xoá. Nếu bạn bật AAR, ứng dụng được chỉ định trong AAR luôn nhận được thông báo Truyền tia Android. Nếu ứng dụng không hiện tại, Google Play đã bắt đầu tải xuống ứng dụng. Do đó, ý định sau về mặt kỹ thuật thì bộ lọc này không cần thiết cho các thiết bị Android 4.0 trở lên nếu sử dụng AAR:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.com.example.android.beam"/> </intent-filter>
Nhờ bộ lọc ý định này, bạn có thể khởi động ứng dụng com.example.android.beam
ngay bây giờ
khi thiết bị quét một thẻ NFC hoặc nhận được một Truyền tia Android có AAR là
loại com.example.android.beam
hoặc khi một tin nhắn có định dạng NDEF có chứa bản ghi MIME
thuộc loại application/vnd.com.example.android.beam
.
Mặc dù AAR đảm bảo ứng dụng sẽ được khởi động hoặc tải xuống, nhưng bộ lọc ý định được đề xuất, vì các chế độ này cho phép bạn bắt đầu một Hoạt động mà bạn chọn trong thay vì luôn bắt đầu Hoạt động chính trong gói do AAR chỉ định. AAR không có thông tin chi tiết ở cấp Hoạt động. Ngoài ra, vì một số thiết bị chạy Android không hỗ trợ AAR, bạn cũng nên nhúng thông tin nhận dạng vào bản ghi NDEF đầu tiên của NDEF thư và lọc cho nội dung đó để phòng trường hợp. Xem bài viết Tạo tài liệu phổ biến Các loại bản ghi NDEF để biết thêm thông tin về cách tạo bản ghi.