2012-06-17 67 views
8

我正在嘗試編寫一個簡單的應用程序來與NFC標籤進行交互,但似乎無法讓我的手機做任何事情,但會觸發默認的NFC標籤應用程序。我真的只想攔截我掃描的任何標籤,確定它是否有一些數據,並據此採取行動。Android NFC意圖並未開始我的活動

現在我的清單文件看起來像

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

掃描NFC標籤然而,當,我從來沒有看到活動開始。我在這裏錯過了什麼嗎?我嘗試將意圖過濾器放入BroadcastReceiver之內,並且沒有任何運氣...

回答

21

您無法使用掃描的所有NFC標籤啓動您的應用程序。 Android將根據意向過濾器的具體情況確定最合適的應用程序。但是,如果您的應用在前臺運行,則可以使用NFC foreground dispatch來捕獲所有NFC意圖。

onCreate()附加:

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

onResume()附加:

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

onPause()附加:

mAdapter.disableForegroundDispatch(this); 

onNewIntent您可以在NFC標籤這樣得到:

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

爲什麼地球上你不能在一個地方收到所有的NFC活動...... – FlyingStreudel

+1

NFC的想法是它可以做一些事情,例如在您的手機上自動執行相應的操作。一些例子:在瀏覽器中打開一個URL,登入Foursquare,自動連接到Wifi網絡。 Android根據應用的意向過濾器確定將哪個應用轉發到NFC意圖。最具體的過濾器「勝利」。如果找到多個匹配項,應用程序選擇器會呈現給用戶。有一個例外:NFC前臺調度,在前臺運行的應用程序可以請求獲取特定類型的所有NFC意圖。 –

+0

我想我只是不明白爲什麼這是所選擇的功能,不像短信,其意圖可以被任何數量的接收器接收和轉播。似乎很愚蠢的是,你只能採取一次與NFC技術互動的行動。 – FlyingStreudel

6

SDK文檔顯示這是一個基本示例。

<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

請注意上例中的'category'元素。這真的很有必要(儘管名稱「DEFAULT」另有說明)。 –

+0

你能告訴我誰可以根據不同的NFC標籤發起不同的活動? tag1/prod/234或tag3/buyme/3422。如果有產品,我想發起一個ProductionInfo活動,但是我想把它放在一個列表中, – Karoly

0

Android的自動的動產的最相關的應用來處理掃描NFC標籤。您需要在intent-filter中更具體,即只聽TEXT-Tags,URL-Tags或CONTACT-Tags。這可以通過進一步指定過濾器來完成,使用您的示例<data android:mimeType="text/plain" />作爲TEXT-Tags。否則,將會觸發默認的NFC-Tag應用程序。

1

您期待標籤以NDEF格式定義。所以你的程序只有在被讀取的標籤是NDEF格式時纔會啓動。

您可以嘗試更通用的意圖過濾器,如TAG_DISCOVERED或TECH_DISCOVERED。