2015-10-11 7 views
5

Ich habe ein NFC-Tag. Ich möchte eine Android-Anwendung schreiben, die automatisch gestartet wird und Daten von NFC erhält, wenn das NFC-Tag mit dem Telefon gescannt wird.Ist es möglich, eine App zu starten, wenn ein NFC-Tag gescannt wird?

Dies sollte funktionieren, wenn davon ausgegangen wird, dass auf dem Gerät NFC aktiviert ist und keine anderen Anwendungen auf dem Telefon ausgeführt werden. Ich habe einige Anwendungen gefunden, die eine andere Anwendung starten können, aber meine Anwendung sollte funktionieren, ohne dass eine solche zusätzliche Anwendung im Hintergrund ausgeführt wird.

Gibt es eine Möglichkeit, diese Aufgabe zu lösen?

Antwort

8

Damit Ihre App (tatsächlich Aktivität) beim Scannen eines Tags gestartet wird, müssen Sie Ihrem App-Manifest einen entsprechenden Intent-Filter hinzufügen.

Wenn Sie Ihre App starten nur für jeden Tag wollen, sind die TECH_DISCOVERED Intent-Filter, was Sie verwenden wollen:

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

Diese Intent-Filter eine zusätzliche XML-Ressourcendatei erfordern, die die Tag-Technologien definiert, die Ihre App sollte zuhören (Notieren Sie sich den Tag außerhalb des Intent-Filters).Die zur Verfügung stehenden Technologien sind die im Namespace android.nfc.tech.*, zur Zeit:

  • android.nfc.tech.IsoDep
  • android.nfc.tech.MifareClassic
  • android.nfc.tech.MifareUltralight
  • android.nfc.tech.Ndef
  • android.nfc.tech.NdefFormatable
  • android.nfc.tech.NfcA
  • android.nfc.tech.NfcB
  • android.nfc.tech.NfcBarcode
  • android.nfc.tech.NfcF
  • android.nfc.tech.NfcV

nur jeden Tag zu entdecken, würden Sie eine XML-Datei wie folgt aus (erstellen Sie die Datei als xml/nfc_tech_filter.xml) erstellen:

<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.NfcBarcode</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcF</tech> 
    </tech-list> 
    <tech-list> 
     <tech>android.nfc.tech.NfcV</tech> 
    </tech-list> 
</resources> 

Beachten Sie, dass Sie muss nicht notwendigerweise die anderen Technologien wie

0 einbeziehen
  • IsoDep impliziert entweder NfcA oder NfcB,
  • MifareClassic impliziert NfcA,
  • MifareUltralightNfcA impliziert, und
  • Ndef/NdefFormatable implizieren entweder NfcA, NfcB, NfcF oder NfcV.
  • Der obige Intent-Filter wird ausgelöst, wenn es keine andere App mit einem besseren Filter für übereinstimmende Absichten gibt. Eine bessere Übereinstimmung wäre eine Übereinstimmung für den Datentyp, der für das Tag verwendet wird. Wenn Ihr Tag beispielsweise eine URL enthält (in einer NDEF-Nachricht gekapselt), erhält eine App, die über URLs ausgelöst wird, Vorrang vor Ihrer App. Wenn Sie die für Ihre Tags verwendeten Datentypen kennen, können Sie auch einen Filter für diese Datentypen hinzufügen. Zum Beispiel passen einfach alle "http: //" und "https: //" URL, könnten Sie verwenden:

    <activity ...> 
        <intent-filter> 
         <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
         <category android:name="android.intent.category.DEFAULT" /> 
         <data android:scheme="http" /> 
         <data android:scheme="https" /> 
        </intent-filter> 
    </activity> 
    

    Und falls Ihr Tag enthält den MIME-Typ „application/vnd.com.example “, könnten Sie verwenden:

    <activity ...> 
        <intent-filter> 
         <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
         <category android:name="android.intent.category.DEFAULT" /> 
         <data android:mimeType="application/vnd.com.example" /> 
        </intent-filter> 
    </activity> 
    

    Sie sogar mehrere Absicht Filter für eine Aktivität kombinieren könnte:

    <activity ...> 
        <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" /> 
    
        <intent-filter> 
         <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
         <category android:name="android.intent.category.DEFAULT" /> 
         <data android:scheme="http" /> 
         <data android:scheme="https" /> 
        </intent-filter> 
        <intent-filter> 
         <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
         <category android:name="android.intent.category.DEFAULT" /> 
         <data android:mimeType="application/vnd.com.example" /> 
        </intent-filter> 
    </activity> 
    

    Schließlich gibt es noch eine NFC-bezogenen Intent-Filter:

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

    Sie würden jedoch normalerweise nicht diesen Intent-Filter im Manifest verwenden. Es ist nur als Fallback gedacht und wird nur dann ausgelöst, wenn keine andere App die Technologie oder die Daten des gescannten Tags auslöst. Es ist also nicht notwendig, diesen Intent-Filter von Ihnen bereits für den oben genannten TECH_DISCOVERED Intent-Filter hinzuzufügen.

    1

    Fügen Sie folgende intent-filter zu Ihrem Haupt-activity Tag in der AndroidManifest.xml Datei hinzu.

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

    Jetzt, wenn Sie Ihr NFC-Tag auf Ihr Telefon tippen, wird Ihre Anwendung aufgerufen und ausgeführt.

    +0

    Funktioniert es, wenn ich alle Anwendungen ausschalten, die auf meinem Telefon laufen? Es sieht so aus, als ob ich mein Telefon neu starte und NFC berühre, wenn das Telefon eingeschaltet ist, dann App. wird gestartet werden. Ist es möglich? – Jame

    +1

    Ja, ich habe es vorher getestet, Sie müssen nur Ihre NFC einschalten. – user3406222

    +0

    Vielen Dank – Jame

    Verwandte Themen