More than a little confusing I'm afraid. If I can paraphrase, a tag
will be delivered to an activity if there exists an intent filter for
ACTION_TECH_DISCOVERED, and the tag reports a technology list that is
a sub-set of at least one tech-list in the array of tech-lists defined
by the XML filter file attached to the activity/intent-filter. So if I
have a tech-list array with a single tech-list like this:
<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>
every tag will match and be delivered to this activity.
I noticed two more discrepancies between the NFC DevGuide page, and
the reference documentation for NfcAdapter. On the reference page, it
shows the intent filter in a manifest as this:
<activity android:name=".nfc.TechFilter" android:label="NFC/
TechFilter">
<!-- Add a technology filter -->
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" /
>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/filter_nfc"
/>
</activity>
while on the NFC DevGuide page it says this:
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter.xml" />
</intent-filter>
Notice how the <meta-data> tag is inside the <intent-filter> in the
second case? Do you also see where the first one does not include
the .xml on the android:resource? If the first example is correct (and
I think it is), that would explain why you can't set meta-data on an
intent filter in code. I'm not near my Android computer so I can't try
these out. But clearly the documentation needs to be fixed. Thanks
- dave
On Feb 23, 1:01 pm, Nick Pelly <[email protected]> wrote:
> On Wed, Feb 23, 2011 at 8:45 AM, davemac <[email protected]> wrote:
> > What you're saying doesn't jive with the documentation, which says the
> > following (onhttp://developer.android.com/guide/topics/nfc/index.html):
>
> > Specifiying [sic] multiple technologies within the same list tells the
> > system to filter tags that support all of the technologies.
>
> This particular sentence is a little confusing in the docs, i'll try and
> have it improved.
>
> > The
> > example below never filters a tag because no tag supports all of the
> > technologies at once. You can remove the ones that you do not need.
> > The docs say a tag will only match if all tag technologies are listed
> > in my tech-list,
>
> No the docs don't say that.
>
> There is a better explanation here, which matches with how I explained it,
> which is how it is :)
>
> http://developer.android.com/reference/android/nfc/NfcAdapter.html#AC...
>
> """
> A tag matches if any of the tech-list sets is a subset of
> Tag.getTechList()<http://developer.android.com/reference/android/nfc/Tag.html#getTechList()>.
> Each of the tech-lists is considered independently and the activity is
> considered a match is any single tech-list matches the tag that was
> discovered. This provides AND and OR semantics for filtering desired techs.
> """
>
> and all tech-list technologies are implemented by the
>
> > tag. You're saying that the tag's technologies only need to match a
> > sub-set of the tech-list.
>
> yes
>
> > Or are you saying that a MifareUltralight
> > tag only reports MifareUltralight technology?
>
> No.
>
> > Or that the docs are
> > wrong?
>
> No they're just a little confusing.
>
> > I have a related question that I hope you don't mind answering here as
> > well. To build an intent filter in code that supports tech, how do you
> > specify the techlists on it? Or does this only work in foreground
> > dispatch mode?
>
> I am a little hazy on the details for this one, but I believe the best
> practice is to define all the intent filters you might want in the manifest,
> and then turn intent-filters on and off at run-time.
>
> > - dave
>
> > On Feb 23, 12:41 am, Nick Pelly <[email protected]> wrote:
> > > On Tue, Feb 22, 2011 at 6:50 PM, davemac <[email protected]> wrote:
> > > > I'm reading the documentation on NFC tags and intent filters to match
> > > > on. For an action of ACTION_TECH_DISCOVERED, the intent filter must
> > > > list the technologies to match on, using a filter file. What I wanted
> > > > clarification on is whether or not I need to also specify for example
> > > > NfcA when I'm looking for a Mifare Utralight tag.
>
> > > > For the Mifare Ultralight tag, the documentation says this:
> > > > NfcA will also be enumerated on the tag, because all MIFARE Ultralight
> > > > tags are also NfcA tags.
>
> > > > This suggests to me that my XML filter file should say this:
>
> > > > <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
> > > > <tech-list>
> > > > <tech>android.nfc.tech.NfcA</tech>
> > > > <tech>android.nfc.tech.MifareUltralight</tech>
> > > > </tech-list>
> > > > </resources>
>
> > > > because if the tag is enumerating NfcA in addition to
> > > > MifareUltralight, my intent filter will only match if I specify both
> > > > technologies, not just MifareUltralight. Is that true? This applies to
> > > > IsoDep as well, which enumerates both NfcA and NfcB, in which case I
> > > > would need to specify all three. True? I don't have available hardware
> > > > to test this for myself. Thanks for your help.
>
> > > You do not need to specify both NfcA and MifareUltralight. You can just
> > > specify MifareUltralight. The <tech-list> only requires a subset of
> > tech's
> > > in order to match.
>
> > > In the case of MIFARE Ultralight, it happens to always be based on NfcA
> > > technology. So tags with the MifareUltralight tech will always also have
> > the
> > > NfcA tech. So there is no harm also putting NfcA in the <tech-list>. But
> > it
> > > is not strictly required.
>
> > > Nick
>
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Android Developers" group.
> > To post to this group, send email to [email protected]
> > To unsubscribe from this group, send email to
> > [email protected]
> > For more options, visit this group at
> >http://groups.google.com/group/android-developers?hl=en
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en