Как запустить приложение без значка запуска, отсканировав тег NFC?

Я хочу запустить свое приложение, отсканировав тег NFC, содержащий приложение для Android. Запись. Однако у этого приложения не должно быть значка запуска, поэтому я не могу использовать CATEGORY_LAUNCHER.

Моя проблема в том, что если я закомментирую строку CATEGORY_LAUNCHER в манифесте, приложение больше не запускается (вместо этого выполняется поиск в Google Play):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.my">

    <application android:label="@string/app_name">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <!--<category android:name="android.intent.category.LAUNCHER" />-->
            </intent-filter>
        </activity>
    </application>
</manifest>

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

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

Что мне делать, чтобы все заработало? Следует ли мне добавить код в MainActivity для обработки NDEF_DISCOVERED намерения?


person Bruno Parmentier    schedule 17.05.2015    source источник
comment
Вы проверяли эту ссылку: - Нажмите здесь   -  person Pankaj    schedule 17.05.2015
comment
@Clairvoyant Да, это ссылка, на которую я указал в своем вопросе. Но он не объясняет, что именно должно быть activity в манифесте для работы AAR.   -  person Bruno Parmentier    schedule 17.05.2015
comment
Вы точно знаете, что это возможно? Приложение, которое не может быть запущено из средства запуска, звучит так, как будто система мешает вам сделать. Возможно, вы сможете проверить наличие необходимых данных, и, если их нет, отобразить полезное сообщение для пользователя и позвонить finish().   -  person nasch    schedule 18.05.2015
comment
Какие данные содержит ваш тег? Только AAR или любые другие записи NDEF?   -  person Michael Roland    schedule 18.05.2015
comment
@MichaelRoland Просто AAR (который я написал с NdefRecord.createApplicationRecord("app.my")).   -  person Bruno Parmentier    schedule 19.05.2015


Ответы (2)


Типичный способ сделать это - добавить к тегу еще одну запись (тип MIME, внешний тип NFC Forum или URI) в дополнение к записи приложения Android (AAR). В этом случае AAR должен быть последней (или, по крайней мере, не первой) записью сообщения NDEF на теге.

Затем вы можете поймать обнаружение тега, отфильтровав этот конкретный тип данных (т. Е. Тип первой записи сообщения NDEF в вашем теге) с помощью фильтра намерения NDEF_DISCOVERED. Например. для внешнего типа NFC Forum:

<activity android:name=".MainActivity">
    <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>
</activity>

В этом случае AAR будет следить за тем, чтобы ваше приложение получило приоритет над любыми другими приложениями, зарегистрированными для того же типа, и что Play Store открыт для вашего приложения, если оно еще не установлено.

Если вы не зарегистрируете какое-либо действие для соответствующего NDEF_DISCOVERED фильтра намерений, AAR вызовет первое действие, которое имеет _4 _ / _ 5_ фильтр намерений (в этом случае Android не будет передавать дескриптор тега для вашего действия). Следовательно, если вы не зарегистрируетесь для NDEF_DISCOVERED намерений или _7 _ / _ 8_ намерений, механизм AAR не будет работать.

Но что, если вы хотите, чтобы ваш тег только содержал AAR и никаких других записей?

Вы можете сделать это, зарегистрировав фильтр намерений для самого AAR. AAR - это внешний тип форума NFC с именем типа "urn: nfc: ext: android.com:pkg", поэтому вы можете использовать следующий фильтр намерений:

<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="/android.com:pkg" />
</intent-filter>
person Michael Roland    schedule 22.05.2015

Я заставил его работать, установив пользовательский mimeType в intent-filter, например:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.my">

    <application android:label="@string/app_name">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <!--<category android:name="android.intent.category.LAUNCHER" />-->
            </intent-filter>
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/vnd.app.my" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Затем создайте NdefRecord для записи на теге:

NdefRecord.createMime("application/vnd.app.my", null);

При этом не используется AAR, который, насколько я понимаю, работает на уровне приложения (а не на уровне активности) и гарантирует, что только мое приложение может быть запущено. Но я полагаю, что такого специального типа MIME вполне достаточно.

person Bruno Parmentier    schedule 18.05.2015