2012-01-25 4 views
2

Я хочу, чтобы мое приложение перехватывало все теги, обнаруженные телефоном. Таким образом, я хочу проверить uid тега и затем передать намерение (показать выбор приложения и т. Д.).Android NFC: Перехватить все теги

<action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
<action android:name="android.nfc.action.TAG_DISCOVERED"/> 
<action android:name="android.nfc.action.TECH_DISCOVERED"/> 

То, что я в настоящее время в моей декларации, наряду с умыслом фильтром для TAG_DISCOVERED:

<tech-list> 
    <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.IsoDep</tech> 
    <tech>android.nfc.tech.MifareClassic</tech> 
    <tech>android.nfc.tech.Ultralight</tech> 
    <tech>android.nfc.tech.Ndef</tech> 
    <tech>android.nfc.tech.NdefFormatable</tech> 
</tech-list> 

Когда я отсканировать Mifare смарт-карту, мое приложение получает называется, когда я использую различные тег с NXP ICODE ICs, запускается стандартное приложение тегов Android.

Любой намек на то, как я могу обеспечить, чтобы я мог видеть ВСЕ теги?

ответ

7

Прежде всего, способ, которым работает технический список, заключается в том, что все перечисленные технологии объединены вместе, то есть намерение передается приложению, если у тега есть ВСЕ различные перечисленные технологии. Я не знаю ничего подобного. что вы хотите сделать, это больше:

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

и так далее. Это ORs различные теги, которые вы хотите. (NfcA или NfcB и т. Д.). Теперь некоторые из этих технологий идут вместе, как NfcA и Ultralight или Ndef. Так что если вы хотите, чтобы поймать карту, которая NFCA и ЦНК вы бы использовать

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

Теперь приложение, которое наиболее близко соответствует тек на бирке будет запущен, или будет показано в меню выбора. Но NDEF_DISCOVERED получает приоритет над TECH_DISCOVERED. Теперь программа запуска NDEF_DISCOVERED может быть очень специфичной в том, какие теги передаются. Хотя некоторые форматы NDEF (например, Mime type) позволяют использовать фильтры «поймать все» (например, «/» для Mime), некоторые нет. (например, для записи Ndef с отформатированным uri). Для них, если есть определенное приложение, нацеленное на него, если вы не знаете его и не введете в него, вы не сможете гарантировать, что ваше приложение будет запущено. Также я никогда не мог иметь более одного фильтра намерения для тегов Ndef (Mime OR URI, но не оба). Но это может быть так, что я не очень старался.

И если другое приложение пытается сделать то же самое (уловить как можно больше тегов), вы всегда будете вызваны с ним. Таким образом, нет никакого способа поймать каждый отдельный тег, если только у вас нет единственного приложения на телефоне. Но форматирование кода вашего технологического списка, как вы видите выше, поможет вам приблизиться.

2

Вы можете теоретически сделать это с помощью переднего плана диспетчеризация:

http://developer.android.com/guide/topics/nfc/advanced-nfc.html#foreground-dispatch

Вы должны обрабатывать все типы NDEF_DISCOVERED MIME (/), то все технологии тегов TECH_DISCOVERED, а также TAG_DISCOVERED намерения. Ваше приложение должно быть на переднем плане. Вы не можете гарантировать, что ваше приложение запускается иначе, потому что любое другое приложение всегда может справиться с тем же намерением, что и ваше приложение, и, следовательно, появится список действий.

+1

Если ваше приложение находится на переднем плане, все, что вам нужно, это намерение TAG_DISCOVERED. Это намерение поймает все теги, обнаруженные, когда ваше приложение находится на переднем плане. –

+0

Неправда. Учреждение NDEF_DISCOVERED будет отправлено в другое приложение, если вы не сможете его обработать. TAG_DISCOVERED является наименьшим приоритетом. Вам все равно нужно явно объявить все намерения, которые вы хотите отфильтровать, для отправки переднего плана для его работы. Все, что он делает, это сказать, что система автоматически предпочитает вашу деятельность над чем-либо еще присутствующим, если ваша деятельность правильно фильтрует для намерения и до тех пор, пока ваша деятельность находится на переднем плане. – robertly

+0

Вы уверены?Я просто проверил быстрый тест, изменив фильтр намерений, чтобы поймать ACTION_TAG_DISCOVERED вместо ACTION_NDEF_DISCOVERED. Мое приложение только отфильтровывалось для очень специфического сообщения NDEF типа EXT, и другие теги будут вызывать выборщик приложений, включая другие отформатированные теги NDEF. Но после этого мое приложение все ловит. Я считаю, что TAG_DISCOVERED правильно фильтрует намерение, пока ваше приложение находится на переднем плане, и это то, что я вижу в своем тестовом приложении. –