2011-04-01 40 views
4

我在Nexus S上安裝了NXP TagWriterNFC TagInfo,這是用於我的NFC應用程序開發的相同設備。問題是我的應用程序在標籤讀取後沒有顯示在「完成操作使用」對話框中,只有從市場上安裝都是。調試一段時間後,我嘗試使用demo application,結果是一樣的。我在這裏錯過了什麼?爲了讓意圖過濾器正確解析,必須從市場上安裝應用程序嗎?來自市場的NFC應用覆蓋「完成操作使用」對話條目

更新

我的意圖過濾器只是

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

我曾嘗試加入其他如manual規定,一個接一個,以及一起沒有成功。它可能與MIME類型有關嗎?

當讀取NFC標籤時,只有這兩行與行動有關,而沒有其他內容。

INFO/ActivityManager(111): Starting: Intent { act=android.nfc.action.TECH_DISCOVERED flg=0x10000000 cmp=com.nxp.nfc.tagwriter/.activities.DashboardActivity (has extras) } from pid 197 
INFO/ActivityManager(111): Starting: Intent { cmp=com.nxp.nfc.tagwriter/.activities.ConfirmLicenseActivity } from pid 6250 

眼看android.nfc.action.TECH_DISCOVERED被觸發時,我加入了以下意圖過濾器:

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

<meta-data android:name="android.nfc.action.TECH_DISCOVERED" 
      android:resource="@xml/nfc_tech_filter" /> 

而且res/xml/nfc_tech_filter.xml包含

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

聽起來很不自然,但ididn't不足,如果你有你的應用程序沒有安裝其他兩個你提到你的IntentFilter工作? – codeScriber 2011-04-01 09:19:53

+0

正確的,如果安裝了my和NFCDemo,將會顯示My,NFCDemo和Tags對話框,如果安裝了NXP TagWriter或NFC TagInfo,它們會立即運行,甚至不會預安裝標籤。如果兩個市場都已安裝,則它們都列爲選項,但標籤不是。 – 2011-04-01 09:25:22

+0

這確實是有用的,安裝應用程序從市場到從adb或sdcard安裝應用程序應該沒有區別。 關於意圖過濾器,你想捕捉的確切的intnet是什麼/它是一個MIME類型是不同的,tagWriter具有它,但你不會被過濾掉,android給你最好的匹配,可以你是否錯過了ilter參加intnet派對的小小風箏? – codeScriber 2011-04-01 10:12:27

回答

13

TAG_DISCOVERED不會彈出您的應用程序的原因是因爲它是後退選項:只有當找不到匹配的NDEF_DISCOVERED和TECH_DISCOVERED意圖時,纔會調度TAG_DISCOVERED。

由於恩智浦應用程序註冊了TECH_DISCOVERED,它們將優於您的應用程序。包含TECH_DISCOVERED過濾器的解決方案是正確的,但是您執行此操作的方式是錯誤的。 「技術列表」區塊中的技術被聯合在一起;所以在你的例子中,這意味着過濾器只會匹配具有NfcA和NfcB以及MifareClassic的標籤。由於NfcA和NfcB是完全不同的技術,所以這種過濾器永遠不會匹配。

你真正想要的是所有不同技術的OR。要做到這一點,只需寫只包含一個技術多塊:

<tech-list> 
    <tech>android.nfc.tech.NfcA</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NfcB</tech> 
</tech-list> 

這將匹配NFCA OR NfcB。當然,你應該儘可能準確地過濾你的過濾器,以防止應用程序列表被破壞。如果您只對NfcA標籤感興趣,請不要聲稱其他人。

+0

謝謝,我錯過了和/或參與文件。但是,如果我嘗試單獨指定它們或者甚至只是我們的標籤支持的那些,結果仍然是相同的。這真是令人困惑:) – 2011-04-12 07:40:48

+0

這很奇怪,你可以運行'adb logcat -s RegisteredComponentCache:*'並重新安裝你的軟件包?幾秒鐘後,您應該看到一些記錄來臨,表明哪種活動已經註冊了哪種技術。 – 2011-04-12 08:46:46

+0

現在我覺得很蠢:)日誌只顯示了所有技術類型的'com.nxp.nfc.tagwriter.activities.DashboardActivity',在再次通過manifest之後,我發現了一個錯字。 'intent-filter'不在活動範圍內,因此未註冊。但是,如果您沒有提供有效的答案,我仍然沒有看到它。非常感謝你:) – 2011-04-12 09:26:48

0

你的技術清單應包括技術的組合,你認爲你的卡支持。例如,如果你想讀的卡有NFCA,NfcB和MifareClassic那麼你techlist應該有:

<tech-list> 
    <tech>android.nfc.tech.NfcA</tech> 
    <tech>android.nfc.tech.NfcB</tech> 
    <tech>android.nfc.tech.MifareClassic</tech> 
</tech-list> 

您可以在資源有一個以上的techlist標籤。只有當您的資源中的某個標籤與技術列表相匹配時,您的應用才能被檢測到。

+0

不應該超過'tech-list'匹配那些標籤嗎?還是有幾個需要? – 2011-04-09 11:38:30

+0

w.r.t高於技術列表,只有當它檢測到NfcA,NfcB和MifareClassic時纔會檢測到卡。它不能是或者。 – 2013-09-11 06:18:21