Thông tin cơ bản về NFC

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:

  1. 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ẻ.
  2. Đó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.
  3. 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ế.

Bảng 1. Các TNF được hỗ trợ và mối liên kết tương ứng

Đị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.

Bảng 2. RTD được hỗ trợ cho TNF_WELL_KNOWN và các RTD ánh xạ

Đị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:

  1. 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ể.
  2. 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ước ACTION_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.
  3. 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ặc ACTION_TECH_DISCOVERED ý định.

Sau đây là cách cơ bản của hệ thống phân phối thẻ:

  1. 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ặc ACTION_TECH_DISCOVERED).
  2. 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ặc ACTION_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ó.
  3. Nếu không có ứng dụng nào lọc ý định, thì bạn không cần làm gì cả.
Hình 1. Hệ thống điều phối thẻ

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 qua EXTRA_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ệu getDefaultAdapter()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 ANDOR 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ượng Tag đạ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ới ACTION_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()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:

  1. 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.
  2. 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.
  3. 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ột NdefMessage để đặ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ứa createNdefMessage() đượ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ức com.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:

  1. Tạo một NdefMessage chứa các NdefRecord mà bạn muốn đẩy lên thiết bị kia.
  2. Gọi setNdefPushMessage() bằng NdefMessage hoặc gọi setNdefPushMessageCallback truyền vào đối tượng NfcAdapter.CreateNdefMessageCallback trong phương thức onCreate() 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ụng setNdefPushMessageCallback 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.