Android AAR + Intent Filter: уточнение

На основе этой документации, доступной в документе Android NFC:

Если тег содержит AAR, система диспетчеризации тегов выполняет диспетчеризацию следующим образом:

  1. Попробуйте запустить действие, используя фильтр намерений, как обычно. Если действие, соответствующее намерению, также соответствует AAR, запустите действие.

  2. Если действие, которое фильтрует намерение, не соответствует AAR, если несколько действий могут обработать намерение или если ни одно действие не обрабатывает намерение, запустите приложение, указанное в AAR.

  3. Если ни одно приложение не может запуститься с помощью AAR, перейдите в Google Play, чтобы загрузить приложение на основе AAR.

Из этих строк я понимаю, что если я укажу фильтр намерений для действия A и полученное сообщение NDEF соответствует фильтру A, A будет запущено, даже если сообщение NDEF содержит запись AAR приложения, которому принадлежит A.

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

Что они имеют в виду под «если действие [...] также соответствует AAR»?

Есть кто может подсказать?


person Antonio Sesto    schedule 07.04.2015    source источник


Ответы (1)


1.) Попробуйте запустить действие, используя фильтр намерений, как обычно. Если действие, соответствующее намерению, также соответствует AAR, запустите действие.

Это означает, что действие A имеет NDEF_DISCOVERED фильтр намерений, который соответствует типу данных первой записи NDEF сообщения NDEF в теге и что AAR соответствует имени пакета приложения, которому принадлежит действие A.

2.) Если действие, которое фильтрует намерение, не соответствует AAR, если несколько действий могут обработать намерение или если ни одно действие не обрабатывает намерение, запустите приложение, указанное в AAR.

Это означает, что есть

  • действие A с фильтром намерений NDEF_DISCOVERED, который не соответствует типу данных первой записи NDEF сообщения NDEF в теге и, что AAR соответствует имени пакета приложения, которое деятельность А принадлежит,
  • действие A и действие B, оба из которых имеют фильтр намерений NDEF_DISCOVERED, соответствующий типу данных первой записи NDEF сообщения NDEF в теге и что AAR соответствует имени пакета приложения, которому принадлежат действия A и B, или
  • никакая активность приложения, соответствующая AAR, не имеет фильтра намерения NDEF_DISCOVERED.

В этом случае приложение с именем пакета, совпадающим с именем в AAR, запускается путем отправки действия намерения MAIN с категорией LAUNCHER для первого действия в вашем приложении, которое имеет такой фильтр намерений. Следовательно, приложение «запускается», как если бы был нажат значок запуска для этого действия.

3.) Если ни одно приложение не запускается с помощью AAR, перейдите в Google Play, чтобы загрузить приложение на основе AAR.

Это означает, что если нет приложения с именем пакета, совпадающим с именем в AAR, то открывается Play Store.


Так, например, если у вас есть сообщение NDEF

+------------------------------+----------------------+
| URI: http://www.example.com/ | AAR: com.example.app |
+------------------------------+----------------------+

тогда вам понадобится приложение с именем пакета com.example.app, которое имеет одно действие с фильтром намерений, например

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
</intent-filter>

Сценарий 1 (соответствие активности А):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Сценарий 2a (нет совпадений для действия A, запущен MAIN):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <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>

Сценарий 2b (сопоставление действий A и B, MAIN запущен):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="A" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
        <activity android:name="B" ...>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Сценарий 2c (нет интент-фильтра NDEF_DISCOVERED, запущен MAIN):

<manifest package="com.example.app" ... >
    <uses-permission android:name="android.permission.NFC" />
    <application ...>
        <activity android:name="MAIN" ...>
            <intent-filter>
                <action android:name="android.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
person Michael Roland    schedule 18.06.2015
comment
Спасибо за ваш обширный ответ: я внимательно прочитаю его, как только смогу. - person Antonio Sesto; 19.06.2015
comment
Если указанная вами активность не запускается, а вместо нее запускается MAIN, проверьте порядок ваших записей. Ответ уже гласит, но все же доставил мне немного хлопот, так как я пропустил эту часть. НЕ ставьте AAR в качестве первой записи. - person TreyWurm; 24.02.2021