Приложения NFC из маркета переопределяют Завершите действие, используя записи диалога

Я установил NXP TagWriter и NFC TagInfo на Nexus S, том же устройстве, которое использовалось для разработки моего приложения NFC. Проблема в том, что мое приложение не отображается в диалоговом окне «Завершить действие с помощью» после чтения тега, отображаются только оба приложения, установленные с рынка. После некоторой отладки я попытался использовать демонстрационное приложение, и результатом было такой же. Что мне здесь не хватает? Должны ли приложения устанавливаться из магазина, чтобы фильтры намерений анализировались должным образом?

Обновить

Мой фильтр намерений был просто

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

Я попытался добавить другие, как указано в руководстве, также один за другим. как все вместе без успеха. Может ли это быть как-то связано с типом пантомимы?

Когда считывается тег 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>

person David Kuridža    schedule 01.04.2011    source источник
comment
звучит маловероятно, но я не понял, если ваше приложение установлено без двух других, которые вы упомянули, работает ли ваш IntentFilter?   -  person codeScriber    schedule 01.04.2011
comment
Правильно, если установлены my и NFCDemo, отображается диалог с My, NFCDemo и Tags, если установлены NXP TagWriter или NFC TagInfo, они запускаются сразу, даже не отображаются предустановленные теги. Если установлены оба из маркета, они оба перечислены как опция, однако теги — нет.   -  person David Kuridža    schedule 01.04.2011
comment
это действительно утомительно, не должно быть разницы между установкой приложений из маркета и установкой приложений с adb или sdcard. Что касается фильтра намерений, какой именно интнет вы хотите захватить / достаточно того, что тип mime отличается, и он есть у tagWriter, но вы не должны отфильтровываться, Android дает вам ЛУЧШИЕ совпадения, может это может быть, вам не хватает небольшой суммы для фильтра, чтобы присоединиться к интернет-вечеринке?   -  person codeScriber    schedule 01.04.2011
comment
TAG_DISCOVERED на данный момент, я безуспешно пытался добавить все три, я даже добавил метаданные и ничего. Поскольку теги пусты, в файле манифеста не указан тип mime. Интересно, что приложение Теги по умолчанию, входящее в состав прошивки, также не отображается.   -  person David Kuridža    schedule 01.04.2011
comment
опубликуйте фильтр намерений. Я бы также сказал, что TAG_DISCOVERED должен заставить ваше приложение появиться. Если вы хотите убедиться, что средство выбора намерений не отображается, кстати, и ваше приложение запускается напрямую, создайте тег MIME NDEF с типом MIME, который вы фильтруете, относится к вашей деятельности. Процесс фильтрации начинается с сообщений ndef mime, затем продолжается фильтрация на основе технологии, наконец, TAG_DISCOVERED.   -  person Sven Haiges    schedule 04.04.2011
comment
Я обновил вопрос с дополнительной информацией о фильтре намерений.   -  person David Kuridža    schedule 05.04.2011


Ответы (2)


Причина, по которой TAG_DISCOVERED не открывает ваше приложение, заключается в том, что это резервный вариант: только когда не будет найдено совпадений для намерений NDEF_DISCOVERED и TECH_DISCOVERED, TAG_DISCOVERED будет отправлен.

Поскольку приложения NXP регистрируются для TECH_DISCOVERED, они будут предпочтительнее вашего приложения. Ваше решение включить фильтр TECH_DISCOVERED правильно, но то, как вы это делаете, неверно. Технологии в блоке «tech-list» объединяются по И; поэтому в вашем примере это означает, что фильтр будет соответствовать только тегам, которые имеют NfcA, NfcB и MifareClassic. Поскольку NfcA и NfcB — очень разные технологии, которые несовместимы, этот фильтр никогда не будет совпадать.

Что вам действительно нужно, так это ИЛИ всех различных технологий. Для этого просто напишите несколько блоков, содержащих только одну технологию:

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

Это будет соответствовать NfcA ИЛИ NfcB. Конечно, вы должны сделать свой фильтр максимально точным, чтобы не загромождать список приложений. Если вас интересуют только теги NfcA, не претендуйте на остальные.

person Martijn Coenen    schedule 11.04.2011
comment
Спасибо, я пропустил часть И/ИЛИ в документации. Однако, если я попытаюсь указать их отдельно или даже только те, которые поддерживаются нашими тегами, результат останется прежним. Это действительно сбивает с толку :) - person David Kuridža; 12.04.2011
comment
Странно, вы можете запустить adb logcat -s RegisteredComponentCache:* и переустановить свой пакет? Через несколько секунд вы должны увидеть запись в журнале, указывающую, какая активность зарегистрирована для какой технологии. - person Martijn Coenen; 12.04.2011
comment
Я чувствую себя глупо сейчас :) Логи показали только com.nxp.nfc.tagwriter.activities.DashboardActivity для всех типов технологий, еще раз просмотрев манифест, я заметил опечатку. intent-filter не участвовал в деятельности и поэтому не был зарегистрирован. Однако, если бы вы не предоставили правильный ответ, я бы все равно его не увидел. Одно огромное спасибо вам :) - person David Kuridža; 12.04.2011
comment
Martijn ваше объяснение является удивительным! Вы спасли мои 10 часов сегодня! - person Sana; 11.12.2011
comment
Так легко игнорировать концепции И и ИЛИ во время чтения. Я потратил один полный день, чтобы решить эту проблему. Большое спасибо! - person Sushil Kadu; 11.09.2013
comment
Рад, что нашел это после нескольких часов обхода stackoverflow! - person SubChord; 28.11.2017

Ваш список технологий должен состоять из комбинации технологий, которые, по вашему мнению, поддерживает ваша карта. Например, если карта, которую вы хотите прочитать, имеет NfcA, NfcB и MifareClassic, то ваш технический список должен содержать:

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

В ваших ресурсах может быть несколько тегов технического списка. Ваше приложение будет обнаружено только в том случае, если тег соответствует одному из технических списков в ваших ресурсах.

person azharb    schedule 06.04.2011
comment
Разве выше tech-list не должны совпадать с этими тегами? Или нужно несколько? - person David Kuridža; 09.04.2011
comment
В приведенном выше списке технологий карта будет обнаружена только тогда, когда она обнаружит NfcA, NfcB и MifareClassic. Не может быть ни того, ни другого. - person Sushil Kadu; 11.09.2013