2015-10-11 42 views
5

Tôi có thẻ NFC. Tôi muốn viết một ứng dụng Android được tự động khởi chạy và nhận dữ liệu từ NFC khi thẻ NFC được quét bằng điện thoại.Có thể khởi chạy ứng dụng khi quét thẻ NFC không?

Điều này sẽ hoạt động giả định rằng thiết bị đã bật NFC và không có ứng dụng nào khác đang chạy trên điện thoại. Tôi đã tìm thấy một số ứng dụng có thể khởi chạy một ứng dụng khác, nhưng ứng dụng của tôi sẽ hoạt động mà không cần một ứng dụng bổ sung nào chạy trong nền.

Có cách nào để giải quyết tác vụ này không?

Trả lời

8

Để tải ứng dụng của bạn (thực tế là hoạt động) bắt đầu khi quét thẻ, bạn cần thêm bộ lọc mục đích thích hợp vào tệp kê khai ứng dụng của mình.

Nếu bạn muốn bắt đầu ứng dụng của bạn chỉ cần bất kỳ thẻ, TECH_DISCOVERED lọc ý định là những gì bạn muốn sử dụng:

<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> 

lọc ý định này yêu cầu một tập tin tài nguyên XML bổ sung mà xác định công nghệ thẻ mà ứng dụng của bạn nên lắng nghe (lưu ý thẻ <meta-data ... />bên ngoài bộ lọc ý định).Các công nghệ sẵn có những người trong namespace android.nfc.tech.*, hiện:

  • android.nfc.tech.IsoDep
  • android.nfc.tech.MifareClassic
  • android.nfc.tech.MifareUltralight
  • android.nfc.tech.Ndef
  • android.nfc.tech.NdefFormatable
  • android.nfc.tech.NfcA
  • android.nfc.tech.NfcB
  • android.nfc.tech.NfcBarcode
  • android.nfc.tech.NfcF
  • android.nfc.tech.NfcV

Để khám phá chỉ cần bất kỳ thẻ, bạn sẽ tạo ra một file XML như thế này (tạo ra các tập tin như xml/nfc_tech_filter.xml):

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
    <tech-list> 
     <tech>android.nfc.tech.NfcA</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcB</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcBarcode</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcF</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcV</tech> 
    </tech-list> 
</resources> 

Lưu ý rằng bạn không nhất thiết cần phải sử dụng các công nghệ khác như

  • IsoDep ngụ ý hoặc NfcA hay NfcB,
  • MifareClassic ngụ ý NfcA,
  • MifareUltralight ngụ ý NfcA, và
  • Ndef/NdefFormatable hàm ý hoặc NfcA, NfcB, NfcF, hoặc NfcV.

Bộ lọc mục đích ở trên sẽ được kích hoạt nếu không có ứng dụng nào khác có bộ lọc mục đích phù hợp hơn. Một kết quả phù hợp hơn sẽ phù hợp với loại dữ liệu được sử dụng trên thẻ. Vì vậy, ví dụ: nếu thẻ của bạn chứa URL (được đóng gói trong thông báo NDEF), một ứng dụng kích hoạt trên URL sẽ được ưu tiên hơn ứng dụng của bạn. Nếu bạn biết (các) loại dữ liệu được sử dụng trên thẻ của mình, bạn cũng có thể thêm bộ lọc cho (các) loại dữ liệu đó. Ví dụ, để phù hợp với bất kỳ chỉ "http: //" và "https: //" URL, bạn có thể sử dụng:

<activity ...> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="http" /> 
     <data android:scheme="https" /> 
    </intent-filter> 
</activity> 

Tương tự, nếu thẻ của bạn có chứa các loại MIME "application/vnd.com.example ", bạn có thể sử dụng:

<activity ...> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:mimeType="application/vnd.com.example" /> 
    </intent-filter> 
</activity> 

bạn thậm chí có thể kết hợp nhiều bộ lọc ý định cho một hoạt động:

<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" /> 

    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="http" /> 
     <data android:scheme="https" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:mimeType="application/vnd.com.example" /> 
    </intent-filter> 
</activity> 

Cuối cùng, có thêm một bộ lọc ý định NFC liên quan đến:

<intent-filter> 
    <action android:name="android.nfc.action.TAG_DISCOVERED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Tuy nhiên, bạn thường sẽ không sử dụng bộ lọc mục đích này trong tệp kê khai. Nó có nghĩa là như là một trở lại chỉ và sẽ chỉ bao giờ được kích hoạt nếu không có ứng dụng khác kích hoạt trên công nghệ hoặc dữ liệu của thẻ quét. Vì vậy, không cần phải thêm bộ lọc ý định này mà bạn đã kích hoạt cho bộ lọc ý định TECH_DISCOVERED được đề cập ở trên.

1

Thêm sau intent-filter vào thẻ activity chính của bạn trong tệp AndroidManifest.xml.

<!-- main activity --> 
<activity ...> 
    ... 
    <intent-filter> 
     <action android-name="android.nfc.action.TAG_DISCOVERED" /> 
     <category android-name="android.nfc.category.DEFAULT" /> 
    </intent-filter> 
    ... 
</activity> 

Bây giờ, khi bạn nhấn thẻ NFC vào điện thoại, ứng dụng của bạn sẽ được gọi và chạy.

+0

Tính năng này có hoạt động nếu tôi tắt tất cả ứng dụng đang chạy trong điện thoại của mình không? Có vẻ như tôi khởi động lại điện thoại của mình và chạm vào NFC khi điện thoại được bật, sau đó là ứng dụng. sẽ được khởi chạy. Có phải nó không? – Jame

+1

Có, tôi đã thử nghiệm trước đó, bạn chỉ cần bật NFC của mình. – user3406222

+0

Cảm ơn bạn rất nhiều – Jame

Các vấn đề liên quan