Можно ли запустить приложение при сканировании NFC-метки?
У меня есть NFC-метка. Я хочу написать приложение для Android, которое автоматически запускается и получает данные от NFC, когда NFC-метка сканируется с помощью телефона.
Это должно работать при условии, что устройство имеет NFC включен и что нет никаких других приложений, работающих на телефоне. Я нашел несколько приложений, которые могут запускать другое приложение, но мое приложение должно работать без такого дополнительного приложения, работающего в фоновом режиме.
Есть ли способ решить эту проблему? это задание?
2 ответа:
Чтобы приложение (фактически activity) запустилось после сканирования тега, необходимо добавить соответствующий фильтр намерений в манифест приложения.
Если вы хотите запустить приложение только для любого тега, вы можете использовать фильтр намерений
TECH_DISCOVERED:Этот фильтр намерений требует дополнительного файла ресурсов XML, который определяет технологии тегов, которые ваше приложение должно прослушивать (обратите внимание на тег<activity ...> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity><meta-data ... />вне фильтра намерений). Доступные технологии находятся в пространстве именandroid.nfc.tech.*, в настоящее время:
android.nfc.tech.IsoDepandroid.nfc.tech.MifareClassicandroid.nfc.tech.MifareUltralightandroid.nfc.tech.Ndefandroid.nfc.tech.NdefFormatableandroid.nfc.tech.NfcAandroid.nfc.tech.NfcBandroid.nfc.tech.NfcBarcodeandroid.nfc.tech.NfcFandroid.nfc.tech.NfcVЧтобы обнаружить только любой тег, вы создадите XML-файл, подобный этому (создайте файл как
xml/nfc_tech_filter.xml):Обратите внимание, что вам не обязательно включать другие технологии в качестве<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <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.NfcBarcode</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcF</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcV</tech> </tech-list> </resources>
IsoDepподразумевает либоNfcA, либоNfcB,MifareClassicподразумеваетNfcA,MifareUltralightподразумеваетNfcA, иNdef/NdefFormatableподразумевают либо то, либо другоеNfcA,NfcB,NfcF, илиNfcV.Вышеуказанный фильтр намерений будет срабатывать, если нет другого приложения, которое имеет более подходящий фильтр намерений. Лучшим совпадением будет совпадение типа данных, используемого в теге. Так, например, если ваш тег содержит URL-адрес (инкапсулированный в сообщение NDEF), приложение, запускающее URL-адреса, получит приоритет над вашим приложением. Если вы знаете типы данных, используемые в тегах, вы также можете добавить фильтр для этих типов данных. Например, для сопоставления любого URL-адреса" http:// "и" https:// " можно использовать:
<activity ...> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> </activity>Аналогично, если тег содержит MIME-типом "приложение/донгов.ком.пример", вы могли бы использовать:
<activity ...> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example" /> </intent-filter> </activity>Вы даже можете объединить несколько фильтров намерений для одного действия:
<activity ...> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example" /> </intent-filter> </activity>Наконец, есть еще одно намерение, связанное с NFC фильтр:
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>Однако обычно вы не используете этот фильтр намерений в манифесте. Он предназначен только для резервного копирования и будет срабатывать только в том случае, если нет другого приложения, запускающего технологию или данные отсканированного тега. Таким образом, нет необходимости добавлять этот intent-фильтр вашего уже триггера для вышеупомянутого
TECH_DISCOVEREDintent filter.
Добавьте следующий тег
intent-filterк вашему основному тегуactivityв файлеAndroidManifest.xml.Теперь, когда вы нажмете NFC-метку на свой телефон, ваше приложение будет вызвано и запущено.<!-- main activity --> <activity ...> ... <intent-filter> <action android-name="android.nfc.action.TAG_DISCOVERED" /> <category android-name="android.nfc.category.DEFAULT" /> </intent-filter> ... </activity>