Получить тег NFC с помощью записи приложения Android NDEF (AAR)

Я работаю над NFC-приложением. Чтобы запустить мое приложение, я использую NDEF-тег с записью AAR NDEF внутри.

Это отлично работает. Но теперь я хочу читать содержимое тега непосредственно с приложением. Как я могу это сделать?

(Это уже работает, когда я удаляю метку с телефона и снова касаюсь ее, но я хочу исключить этот шаг.)

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nfctagscanner.mobileapps.lt.nfctagscanner" >
    <uses-feature android:name="android.hardware.nfc" android:required="true"/>
    <uses-permission android:name="android.permission.NFC" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />


            </intent-filter>


        </activity>
        <activity
            android:name=".NFCScanActivity"
            android:label="@string/app_name" >
            <intent-filter>

                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="nfctagscanner.mobileapps.lt.nfctagscanner" android:host="ext"
                    android:pathPrefix="/android.com:pkg" />
            </intent-filter>
        </activity>
    </application>

</manifest>

И я просто хочу получить намерение NDEF_DISCOVERED. Но я всегда получаю action.MAIN/category.LAUNCHER Намерения с моим отладчиком.

Любая помощь будет оценена. Я делал свою работу, основываясь на этом: Android / NFC: Получить тег в onCreate() без нового намерения

2 ответа

Решение

Если вы хотите, чтобы ваше приложение запускалось по вашему тегу, и вы хотите получать проанализированное сообщение NDEF, ваш тег должен содержать следующее:

  1. Запись NDEF, которую вы хотите отфильтровать как первую запись сообщения NDEF (вы можете создавать фильтры намерений только для самой первой записи NDEF в теге NFC). Учитывая ваш собственный ответ, в вашем случае это будет текстовая запись (или запись MIME-типа с MIME-типом text/plain). Тем не менее, вы можете рассмотреть возможность использования записи внешнего типа NFC Forum с вашим пользовательским именем типа вместо этого (см. Здесь, поскольку это позволит вашему приложению лучше отделять теги от тегов, используемых в других приложениях. Текстовая запись должна быть только используется, если содержит нечитаемый для человека текст.
  2. Если вы хотите убедиться, что только ваше приложение запускается с тегом и что страница Play Store вашего приложения автоматически открывается, если у пользователя нет установленного приложения, вам также следует использовать Android Application Record (AAR). Эта запись должна быть последней записью в сообщении NDEF. (Обратите внимание, что AAR будет учитываться независимо от позиции в сообщении NDEF, но использование его в качестве первой записи вызовет проблему, описанную в сообщении, которое вы связали в своем вопросе.)

Как только у вас есть готовый тег, содержащий правильное сообщение NDEF, вы должны создать соответствующий фильтр намерений для действия, которое должно получить событие обнаружения тега, и сообщение NDEF, которое его вызвало:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

Или, если вы использовали свой собственный внешний тип форума NFC:

<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="/yourdomain.com:yourtypename"/>
</intent-filter>

Если ваше приложение не имеет NDEF_DISCOVERED Фильтр намерений, который соответствует первой записи сообщения NDEF в вашем теге, и ваш тег содержит запись приложения Android, первое действие, объявленное в вашем манифесте, для которого установлен фильтр намерений для android.intent.action.MAIN и с android.intent.category.LAUNCHER будет начато. Поскольку эта деятельность, следовательно, не объявляет о намерении NFC, она будет переданаandroid.intent.action.MAIN (который не содержит дескриптор сообщения / тега NDEF).

Я не знаю, если это правильный ответ, но я нашел решение:

        <activity
            android:name=".NFCScanActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Другие вопросы по тегам