2017-04-11 3 views
1

J'essaie de lire les données d'une étiquette NFC. Si j'utilise l'application "NfcV-reader" de Play Store (écrite par ST Microelectronics, le fabricant de l'étiquette), je peux alors confirmer que l'étiquette contient un enregistrement NDEF avec des données MIME. Le type MIME est « application/myapp » et la charge utile MIME est «», comme indiqué ci-dessous:Android NFC: Réception de TECH_DISCOVERED, en attente de NDEF_DISCOVERED

Je veux que mon propre application pour commencer chaque fois que cette balise est reconnu par Android. J'ai créé l'application avec ce que je pense être le filtre d'intention correct. Voici le XML AndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dummy.nfc.reader"> 

    <uses-permission android:name="android.permission.NFC" /> 
    <uses-feature android:name="android.hardware.nfc" android:required="true" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name=".ActivityNfcReader"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.ACTION_NDEF_DISCOVERED"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
       <data android:mimeType="application/myapp"/> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

J'ai téléchargé l'application à un appareil Nexus 6P (version Android 6.0.1), réglez l'appareil à l'écran d'accueil et a commencé logcat avec un filtre pour la chaîne « nfc » . Voici ce que je reçois:

04-11 16:23:33.108 4050 4050 D NativeNfcTag: Connect to a tech with a different handle 
04-11 16:23:33.273 4050 3909 D NativeNfcTag: Starting background presence check 
04-11 16:23:33.278 918 4148 I ActivityManager: START u0 {flg=0x10008000 cmp=com.android.nfc/.NfcRootActivity (has extras)} from uid 1027 on display 0 
04-11 16:23:33.343 918 3469 I ActivityManager: START u0 {act=android.nfc.action.TECH_DISCOVERED cmp=com.google.android.tag/com.android.apps.tag.TagViewer (has extras)} from uid 1027 on display 0 
04-11 16:23:35.430 4050 3909 D NativeNfcTag: Tag lost, restarting polling loop 
04-11 16:23:35.432 4050 3909 D NfcService: Discovery configuration equal, not updating. 
04-11 16:23:35.433 4050 3909 D NativeNfcTag: Stopping background presence check 

Ma question est: Pourquoi dispatching Android "android.nfc.action.TECH_DISCOVERED" quand je me attends "android.nfc.action.NDEF_DISCOVERED"?

EDIT 1 (en ajoutant plus d'informations après avoir reçu le premier commentaire ci-dessous)

Je l'ai utilisé une autre application, "NFC TagInfo", pour vérifier le contenu de la balise. La balise numérisée apparaît comme suit NFC TagInfo:

Enfin, voici la logcat de présenter l'étiquette à l'appareil Android:

04-12 09:30:48.609 3829 3829 D NativeNfcTag: Connect to a tech with a different handle 
04-12 09:30:48.775 3829 10744 D NativeNfcTag: Starting background presence check 
04-12 09:30:50.661 917 6053 I ActivityManager: START u0 {cmp=at.mroland.android.apps.nfctaginfo/.TagViewer (has extras)} from uid 10103 on display 0 
04-12 09:30:50.834 917 935 I ActivityManager: Displayed at.mroland.android.apps.nfctaginfo/.TagViewer: +160ms 

EDIT 2 (ajouter le logcat correct après avoir résolu le problème avec la réponse acceptée)

Le problème résidait dans le filtre d'intention. Voir la réponse acceptée ci-dessous. Voici le comportement de logcat avec le problème maintenant corrigé:

04-12 12:14:48.237 3829 3829 D NativeNfcTag: Connect to a tech with a different handle 
04-12 12:14:49.371 3829 4052 E BrcmNfcNfa: rw_i93_process_timeout(): retry_count = 1 
04-12 12:14:49.422 3829 14236 D NativeNfcTag: Starting background presence check 
04-12 12:14:49.424 917 4427 I ActivityManager: START u0 {flg=0x10008000 cmp=com.android.nfc/.NfcRootActivity (has extras)} from uid 1027 on display 0 
04-12 12:14:49.457 917 6053 I ActivityManager: START u0 {act=android.nfc.action.NDEF_DISCOVERED typ=application/myapp cmp=com.dummy.nfc.reader/.ActivityNfcReader (has extras)} from uid 1027 on display 0 
04-12 12:14:49.553 917 935 I ActivityManager: Displayed com.dummy.nfc.reader/.ActivityNfcReader: +91ms (total +106ms) 
+0

Avez-vous vérifié (par exemple avec une application comme NFC TagInfo) que Android expose en fait la technologie de balise 'Ndef' pour cette étiquette sur votre appareil? Notez que tous les appareils Android ne prennent pas en charge NDEF sur tous les tags NFC-V car la technologie Tag Type 5 n'a été spécifiée que récemment par le Forum NFC. –

+0

Merci Michael. J'ai mis à jour la question avec des captures d'écran de l'application TagInfo NFC. L'application suggère que Android reconnaît la balise comme NfcV (android.nfc.tech.NfcV) et prend en charge NDEF (android.nfc.tech.Ndef). – pfp

Répondre

1

Votre filtre d'intention pour le message NDEF est incorrect. Vous avez actuellement

<intent-filter> 
    <action android:name="android.intent.action.ACTION_NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="application/myapp"/> 
</intent-filter> 

Alors que les matches de type MIME type MIME sur votre étiquette, l'action intention n'est pas correct. L'action correcte pour découvrir les messages NDEF est "android.nfc.action.NDEF_DISCOVERED". Par conséquent, vous devez changer votre filtre intention de ceci:

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="application/myapp"/> 
</intent-filter> 
+1

Merci Michael - c'est parfait.J'ai mis à jour la question originale avec une deuxième modification pour illustrer le comportement de logcat avec le problème résolu. J'apprécie vraiment votre aide avec ceci. – pfp