2012-06-17 53 views
8

Tôi đang cố gắng viết một ứng dụng đơn giản để tương tác với các thẻ NFC, nhưng tôi không thể có được điện thoại của mình để làm bất cứ điều gì nhưng kích hoạt ứng dụng thẻ NFC mặc định. Tôi thực sự chỉ muốn có thể chặn bất kỳ thẻ nào tôi quét, xác định xem nó có một số dữ liệu trên đó hay không và thực hiện hành động tương ứng.Android NFC Intents không bắt đầu hoạt động của tôi

Ngay bây giờ file manifest của tôi trông giống như

<uses-sdk android:minSdkVersion="10" /> 
<uses-feature android:name="android.hardware.nfc" android:required="true"/> 
<uses-permission android:name="android.permission.NFC"/> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".NfcActivity" 
     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"/> 
     </intent-filter> 
    </activity> 
</application> 

Tuy nhiên khi quét thẻ NFC, tôi không bao giờ nhìn thấy khi bắt đầu hoạt động. Am i thiếu cái gì ở đây? Tôi đã thử đặt bộ lọc ý định bên trong một BroadcastReceiver và không có may mắn ...

Trả lời

21

Bạn không thể khởi động ứng dụng của mình bằng tất cả các thẻ NFC mà bạn quét. Android sẽ xác định ứng dụng phù hợp nhất dựa trên bộ lọc ý định cụ thể. Tuy nhiên, nếu ứng dụng của bạn đang chạy ở nền trước, bạn có thể sử dụng NFC foreground dispatch để nắm bắt tất cả các tính năng NFC.

Trong onCreate() add:

mAdapter = NfcAdapter.getDefaultAdapter(this); 
PendingIntent pendingIntent = PendingIntent.getActivity(
    this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

Trong onResume() add:

mAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 

Trong onPause() add:

mAdapter.disableForegroundDispatch(this); 

Trong onNewIntent bạn có thể có được ở các thẻ NFC như thế này:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
+0

Tại sao trên trái đất bạn có thể không nhận được tất cả các sự kiện NFC ở một nơi ... – FlyingStreudel

+1

Ý tưởng về NFC là nó có thể làm những việc như tự động thực hiện hành động thích hợp trên điện thoại của bạn. Một số ví dụ: mở một URL trong trình duyệt của bạn, đăng nhập vào Foursquare, tự động kết nối với mạng Wifi. Android xác định ứng dụng nào sẽ chuyển tiếp ý định NFC dựa trên bộ lọc mục đích của ứng dụng. Bộ lọc cụ thể nhất "thắng". Nếu tìm thấy nhiều hơn một kết quả phù hợp, trình chọn ứng dụng sẽ được hiển thị cho người dùng. Có một ngoại lệ: công văn foreground của NFC, nơi ứng dụng chạy ở nền trước có thể yêu cầu nhận tất cả các ý định NFC của một loại cụ thể. –

+0

Tôi đoán tôi chỉ không hiểu tại sao đây là chức năng được chọn, không giống như SMS, nơi mà ý định có thể được chọn và phát lại bởi bất kỳ số người nhận nào. Có vẻ ngớ ngẩn khi bạn bị giới hạn chỉ thực hiện một hành động khi tương tác với công nghệ NFC. – FlyingStreudel

6

Tài liệu SDK hiển thị ví dụ này làm ví dụ cơ bản.

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="text/plain" /> 
</intent-filter> 
+0

Lưu ý phần tử 'category' trong ví dụ trên. Nó thực sự là cần thiết (mặc dù tên "DEFAULT" gợi ý khác). –

+0

bạn có thể cho tôi biết tôi có thể khởi chạy các hoạt động khác nhau dựa trên các thẻ NFC khác nhau không? tag1/prod/234 hoặc tag3/buyme/3422. Nếu có sản phẩm, tôi muốn kích hoạt một hoạt động ProductionInfo, nhưng với buyme tôi muốn đưa vào một danh sách, – Karoly

0

Android tự động choses ứng dụng phù hợp nhất để xử lý các thẻ NFC quét. Bạn cần cụ thể hơn trong số intent-filter, tức là chỉ nghe TEXT-Thẻ, URL-Thẻ hoặc CONTACT-Tags. Điều này có thể được thực hiện bằng cách chỉ định thêm bộ lọc, sử dụng, ví dụ của bạn, <data android:mimeType="text/plain" /> cho TEXT-Tags. Nếu không, ứng dụng NFC-Tag mặc định sẽ được kích hoạt.

1

Bạn đang mong đợi các thẻ được định nghĩa theo định dạng NDEF. Vì vậy, chương trình của bạn sẽ chỉ được khởi chạy nếu các thẻ được đọc ở định dạng NDEF.

Bạn có thể thử các bộ lọc ý định chung khác như TAG_DISCOVERED hoặc TECH_DISCOVERED.

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