Как запустить приложение, отсканировав тег NDEF NFC? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь запустить свое приложение путем сканирования тега NFC.У меня есть два тега для проверки:

  1. один (давайте назовем этот «тег A») с одним типом данных URI "http://panasonic.net" и
  2. другой (позволяетвызовите этот «тег B») с двумя типами данных - URI (с TNF: TNF_WELL_KNOWN и RTD: RTD_URI) «urn: nfc: testing.com/ecm/ecap» и URN (TNF: TNF_EXTERNAL_TYPE) »urn: nfc: ext: testing.com: ecm ".

Примечание. Моя главная цель - заставить работать тег B. Этот тег является моим тестовым тегом, и ему не нужно работать с этим приложением.

В моем манифесте я даю разрешения для NFC, и я добавил XML для списка обнаруженных технологий в манифесте.

В теге фильтра намерений у меня есть следующее:

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

Без TECH_DISCOVERED, тег A отображается в списке приложений для автоматического запуска, но тег B. не отображается. При TECH_DISCOVERED оба тега отображаются в списке.
Исправление: без TECH_DISCOVERED для тега A и тега B приложение не отображается в списке автозапуска, но без TECH_DISCOVERED и <data android:scheme="http" android:host="panasonic.net"/> тег A действительно отображает приложение.вверхв списке автозапуска.Для тега A это правильное поведение, потому что Chrome вступает во владение и запускается автоматически, когда <data ... android:host="panasonic.net"/> отсутствует.

Далее, я указал некоторые теги данных в фильтре намерений:

<data android:scheme="http" android:host="panasonic.net"/>
<data android:scheme="http" android:host="fake.com"/>

При сканировании тега A приложение отображается в списке.При сканировании тега B приложение не отображается в списке.Это правильное поведение.

Затем я добавляю тег данных к фильтру намерений для тега B:

<data android:scheme="vnd.android.nfc"
      android:host="ext"
      android:pathPrefix="/com.informationmediary:ecm" />

Здесь у меня возникают проблемы.Я сканирую тег A и тег B, и приложение не отображается в списке автозапуска для обоих.Когда я удаляю теги данных HTTP, оставляя только единицу «vnd.android.nfc», и снова сканирую тег B, приложение все равно не отображается.

Я также пробовал следующие варианты, но безрезультатно:

РЕДАКТИРОВАТЬ: в этот момент я удалил следующее, надеясь заставить работать только тег B:

<data android:scheme="http" android:host="panasonic.net"/>
<data android:scheme="http" android:host="fake.com"/>

1.

    <data android:scheme="vnd.android.nfc"
          android:host="ext"
          android:pathPrefix="/com.informationmediary:ecm" />

2.

    <data android:scheme="vnd.android.nfc"
          android:host="ext"
          android:pathPrefix="/informationmediary.com:ecm" />

3.

    <data android:scheme="urn:nfc"
          android:host="ext"
          android:pathPrefix="/com.informationmediary:ecm" />

4.

    <data android:scheme="urn:nfc"
          android:host="ext"
          android:pathPrefix="/informationmediary.com:ecm" />

5.

    <data android:scheme="vnd.android.nfc"
          android:host="informationmediary.com"
          android:pathPrefix="/ecm/ecap"/>

6.

    <data android:scheme="urn:nfc"
          android:host="informationmediary.com"
          android:pathPrefix="/ecm/ecap"/>

Я пыталсявсе комбинации двух из четырех верхних с двумя нижними: 1 и 5, 1 и 6, 2 и 5, 2 и 6, 3 и 5, 3 и 6, 4 и 5 и 4 и 6

Я сомневался в схеме = "urn: nfc", но все равно попробовал, "схватившись"у соломинки "к этому времени.

Мне нужен тег B, тег A - тестовый.

Я прочитал документацию https://developer.android.com/guide/topics/connectivity/nfc/nfc#ext-type И https://developer.android.com/guide/topics/manifest/data-element#mime инесколько других сообщений на форумах, в которых в основном говорится то же, что и в обзорах developer.android.

1 Ответ

0 голосов
/ 18 сентября 2018

Добавление фильтра намерений для тега B приводит к тому, что тег A больше не выбирается

Когда вы добавляете элемент данных

<data android:scheme="vnd.android.nfc"
      android:host="ext"
      android:pathPrefix="/com.informationmediary:ecm" />

в существующий фильтр намерений

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="panasonic.net" />
    <data android:scheme="http" android:host="fake.com" />
</intent-filter>

Android объединит все элементы данных в один.Следовательно, ваш фильтр намерений в форме

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="panasonic.net" />
    <data android:scheme="http" android:host="fake.com" />
    <data android:scheme="vnd.android.nfc"
          android:host="ext"
          android:pathPrefix="/informationmediary.com:ecm" />
</intent-filter>

означает, что Android попытается сопоставить URL-адрес тега следующим образом:

(scheme == "http" OR scheme == "vnd.android.nfc") AND
(host == "panasonic.net" OR host == "fake.com" OR host == "ext") AND
(path startsWith "/informationmediary.com:ecm")

Следовательно, атрибут android: pathPrefix должен совпадатьЭтот URL-адрес, даже если он явно не указан в других элементах данных.

Вы можете легко избавиться от этой проблемы, указав два отдельных фильтра намерений:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="panasonic.net" />
    <data android:scheme="http" android:host="fake.com" />
</intent-filter>
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="vnd.android.nfc"
          android:host="ext"
          android:pathPrefix="/informationmediary.com:ecm" />
</intent-filter>

Тег B никогда не соответствуетФильтр намерений

Только первая запись в теге сопоставляется с фильтрами намерений.Следовательно, чтобы соответствовать записи внешнего типа, необходимо сделать ее первой записью в теге.Затем, если ваша запись внешнего типа содержит URI «urn: nfc: ext: informationmediary.com: ecm», она будет соответствовать приведенному выше фильтру намерений.Обратите внимание, что запись на самом деле должна содержать только часть "informationmediary.com:ecm", поскольку префикс неявный.

Если вы не можете изменить содержимое тега B, вам нужно будет соответствовать записи URIна этот тег с фильтром намерений.К сожалению, ваш URI в теге B нелегко использовать с Android.Проблема заключается в том, что Android может сопоставлять хост и путь только для URL-адресов в форме «схема: // хост / путь» (обратите внимание на косую черту!).Поскольку вместо этого вы используете URN, в нем нет узла или компонента пути.В этом случае вы можете только попытаться сопоставить схему (то есть «урну») самостоятельно:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="urn" />
</intent-filter>

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

...