NFC автоматически считывает ТЕГИ в разных действиях, не спрашивая, где обрабатывать ТЕГИ

#android #android-activity #tags #android-manifest #nfc

#Android #android-активность #Теги #android-манифест #nfc

Вопрос:

Я хочу читать в разных действиях любой ТЕГ, который не отображается на моем дисплее, какое действие лучше всего подходит для чтения этого тега? Я думаю, это должно быть автоматически. Мой кодовый манифест таков:

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.iprocuratio.strim.TemperatureActivity"
        android:label="@string/title_activity_temperature" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.ConstantsActivity"
        android:label="@string/title_activity_constants" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.FC"
        android:label="@string/title_activity_fc" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.FR"
        android:label="@string/title_activity_fr" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.SatO2"
        android:label="@string/title_activity_sat_o2" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.MainActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.PrescriptionsActivity"
        android:label="@string/title_activity_prescriptions">
        <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>
    <activity
        android:name="com.iprocuratio.strim.MedicamentosActivity"
        android:label="@string/title_activity_medicamentos" >
    </activity>
    <activity
        android:name="com.iprocuratio.strim.Identificacion"
        android:label="@string/title_activity_identificacion" >
        <intent-filter >
            <action android:name="com.google.zxing.client.android.SCAN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.iprocuratio.strim.Pantallaleer"
        android:label="@string/title_activity_pantallaleer" >
        <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>
    <activity
        android:name="com.iprocuratio.strim.IdentificacionFinal"
        android:label="@string/title_activity_identificacion_final" >

    </activity>
</application>
 

Я реализовал чтение ТЕГА в двух действиях:
ПредписаниеакТивность и Pantallaleer.
Например, когда я хочу прочитать ТЕГ в PrescriptionsActivity, всегда появляется следующее изображение:
введите описание изображения здесь

Я бы хотел, чтобы, когда я читаю ТЕГ, он не показывал это окно и автоматически выбирал правильное действие. Кто-нибудь знает, как я могу сделать? Правильный ли мой код?

Дайте мне знать. Спасибо.

С уважением.

Ответ №1:

Оба действия чувствительны к одному и тому же намерению (т. Е. Оба запускаются для тегов, содержащих текстовую запись (или запись типа MIME типа text / plain):

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

Android не может определить, какое действие лучше соответствует потребностям конкретного тега, если оба содержат один и тот же тип данных и оба фильтра соответствуют одному и тому же типу данных. Следовательно, Android показывает средство выбора намерений, позволяющее пользователю выбирать.

Если вы хотите избежать выбора намерений, вам следует использовать разные типы данных для каждого действия (вместо использования очень неопределенного текстового / простого типа данных). Например, если должен запуститься тег PrescriptionsActivity , вы должны написать в тег следующее сообщение NDEF:

  ------------------------------------------------- 
| EXT:iprocuratio.com:prescriptions | <your data> |
 ------------------------------------------------- 
 

Вы можете создать это сообщение NDEF на Android с помощью

 NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("iprocuratio.com", "prescriptions", yourData),
);
 

Затем фильтр намерений для PrescriptionsActivity может выглядеть следующим образом:

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

Аналогично, для этого Pantallaleer действия вы могли бы использовать:

  ------------------------------------------------- 
| EXT:iprocuratio.com:pantallaleer | <your data> |
 ------------------------------------------------- 
 

Вы можете создать это сообщение NDEF на Android с помощью

 NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("iprocuratio.com", "pantallaleer", yourData),
);
 

Затем фильтр намерений для Pantallaleer activity может выглядеть следующим образом:

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