Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NFC applications from market override "Complete action using" dialog entries

I have installed NXP TagWriter and NFC TagInfo on Nexus S, the same device used for my NFC application development. The problem is my application is not shown in the "Complete action using" dialog after Tag is read, only both installed from market are. After debugging it for a while, I have tried using demo application and the result was the same. What am I missing here? Do applications have to be installed from the market in order to have intent filters parsed properly?

Update

My intent-filter was simply

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

I have tried adding others as specified in manual, one by one as well as all together without success. Could it have something to do with mime type?

When NFC tag is read, only these two lines are related to the action and nothing else.

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

Seeing android.nfc.action.TECH_DISCOVERED is triggered, I have added following intent-filter:

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

And res/xml/nfc_tech_filter.xml contains

<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>
like image 432
David Kuridža Avatar asked Dec 09 '22 09:12

David Kuridža


1 Answers

The reason TAG_DISCOVERED does not pop up your app is because it is the fall-back option: only when no matches for the NDEF_DISCOVERED and TECH_DISCOVERED intents can be found, TAG_DISCOVERED will be dispatched.

Since the NXP apps register for TECH_DISCOVERED, they will be preferred over your app. Your solution to include a TECH_DISCOVERED filter is correct, but the way you do it is wrong. The technologies in a "tech-list" block are AND-ed together; so in your example, this means that the filter will only match tags that have NfcA AND NfcB AND MifareClassic. Since NfcA and NfcB are very different technologies that don't go together, this filter will never match.

What you really want is an OR of all the different technologies. To do that, simply write multiple blocks containing only one technology:

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

This will match NfcA OR NfcB. Of course, you should make your filter as accurate as possible, to prevent the application list from clobbering up. If you're only interested in NfcA tags, don't claim the others.

like image 65
Martijn Coenen Avatar answered Dec 28 '22 11:12

Martijn Coenen