2016-05-01 8 views
1

Ich habe bereits versucht, wahrscheinlich 100 verschiedene Möglichkeiten, um es zu erreichen. Ich kann einfach nicht herausfinden, wie das geht.Starten Sie App auf was auch immer (leer) NFC angeschlossen

Ich habe ein leeres NFC-Tag. Ich brauche nur die App zu starten, wenn mein Handy ein NFC-Tag scannt, egal welches Tag es ist oder was darauf steht. Ich möchte nichts darauf schreiben oder es lesen.

Im Moment, wenn ich ein NFC-Tag scanne, öffnet mein Handy den eingebauten NFC-Reader von Android.

Wenn meine App geöffnet ist, erkennt sie das Scannen des NFC-Tags. Aber ich möchte die App starten, indem ich das Tag scanne.

Hier mein Manifest ist:

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

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.nfc.action.TECH_DISCOVERED"/> 
     </intent-filter> 
     <meta-data android:name="android.nfc.action.TECH_DISCOVERED" 
      android:resource="@xml/nfc_tech_filter" /> 
    </activity> 

    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 

Bitte beachte, dass ich verschiedene Arten versucht, die App zu starten ... es hat nicht einmal arbeiten.

Lassen Sie mich wissen, wenn Sie meine MainActivity benötigen. Beachten Sie, dass meine MainActivity beim Start nicht gestartet wird. Ich habe eine Startbildschirm-Aktivität davor.

Ist es überhaupt möglich? Und, ist es möglich, App über Service oder eine Art davon zu starten?

+0

vielleicht klingt es dumm, aber es gibt nur wenige Geräte, die nicht nfc wie eins plus zwei haben, auf welchem ​​Gerät testen Sie Ihren Code? –

+0

S6 Kante plus, Gerät hat nfc. Wie ich oben schrieb, funktioniert es, wenn App geöffnet wird, dann kann ich Sachen durchführen. Aber nicht wenn die App geschlossen ist. – Wladislaw

Antwort

1

Sie Ereignisse für alle (leer oder nicht-leer) Tags mit dem TECH_DISCOVERED Intent-Filter fangen können:

<intent-filter> 
    <action android:name="android.nfc.action.TECH_DISCOVERED"/> 
</intent-filter> 
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" 
      android:resource="@xml/nfc_tech_filter" /> 

Beachten Sie, dass Intent-Filter mit <activity>...</activity> Tags versehen sein müssen. Das <meta-data>-Tag muss sich außerhalb des Intent-Filter-Tags befinden, muss aber auch das Aktivitäts-Tag enthalten.

Darüber hinaus müssen Sie eine Tech-Filterdatei (xml/nfc_tech_filter.xml), die alle Tag-Technologien richtig aufgelistet, die Sie für filtern möchten:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
    <tech-list> 
     <tech>android.nfc.tech.NfcA</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcB</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcF</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcV</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcBarcode</tech> 
    </tech-list> 
</resources> 

Da andere Technologien wie Ndef und IsoDep arbeiten oben auf diesen grundlegenden Tag oben genannten Technologien (NfcA, NfcB usw.) müssen diese nicht in der Filterdatei angegeben werden, da sie bereits von der grundlegenden Tag-Technologie abgedeckt sind.

Beachten Sie, dass wenn Sie mehrere <tech> Einträge innerhalb eines <tech-list> Eintrags auflisten, sie mit dem logischen UND kombiniert werden, während mehrere <tech-list> Einträge mit dem logischen ODER kombiniert werden.

Die oben genannten Filterung für leere und nicht leere Tags mit den Technologien, die Sie in der Filterdatei auflisten. Bei nicht leeren NDEF-formatierten Tags hat jedoch jeder Intent-Filter NDEF_DISCOVERED (aus Ihrer App oder einer anderen App), der mit dem Datentyp auf dem Tag übereinstimmt, Vorrang vor dem TECH_DISCOVERED Intent-Filter. Folglich wird Ihre App in diesen Fällen nicht benachrichtigt. Wenn Sie auch Ereignisse für solche Tags erhalten möchten, müssen Sie einen Intent-Filter NDEF_DISCOVERED mit dem entsprechenden Datentyp registrieren. Z.B. wenn der Datentyp der URL http://www.example.com/

<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" /> 
</intent-filter> 

Schließlich versucht mit den TAG_DISCOVERED Intent-Filter zu vermeiden.Dies ist als Fallback gedacht und wird nur ausgelöst, wenn keine andere App für diesen Tagtyp registriert ist.

+0

Es funktionierte, jetzt das Popup, um meine App zu wählen, kommt auf. Ist es möglich, es als Standard zu setzen? Ich meine, lass es mich zwischen meiner App wählen und in nfc-Leser bauen. Aber ich kann nicht sagen, immer offen mit ... meiner App. Möglich? – Wladislaw

+0

@Wladislaw Nein, TECH_DISCOVERED-Ereignisse können keiner Standard-App zugewiesen werden. Alle Apps mit einem passenden TECH_DISCOVERED-Intent-Filter werden immer in einer Absichtsauswahl angezeigt. Sie können dies nur überwinden, indem Sie einen benutzerdefinierten NDEF-Datensatz in das Tag schreiben und nach dem Datentyp dieses Datensatzes filtern. –

0

ich eine einfache Anwendung erstellt, i verändert nur die Manifest-Datei dazu:

<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> 

     <intent-filter> 
      <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 

    </activity> 
</application> 
+0

Nichts hat sich für mich geändert, immer noch die App öffnet nicht ... ich bin Android 6. – Wladislaw

Verwandte Themen