Starten Sie eine bestimmte Aktivität beim Scannen von NFC-Tag

Ich versuche, eine bestimmte Aktivität zu starten, wenn mein Telefon einen NFC-Tag scannt. So sieht mein Manifest aus:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lgandroid.ddcnfc" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.NFC"/> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.lgandroid.ddcnfc.BluePrintActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <data android:mimeType="application/com.lgandroid.ddcnfc"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <activity android:name="com.lgandroid.ddcnfc.LoginActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.lgandroid.ddcnfc.MainActivity" android:label="@string/app_name" > </activity> <activity android:name="com.lgandroid.ddcnfc.PointDiagnosisActivity" android:label="@string/app_name" > </activity> <activity android:name="com.lgandroid.ddcnfc.PointControlActivity" android:label="@string/app_name" > </activity> <activity android:name="com.lgandroid.ddcnfc.SystemDiagnosisActivity" android:label="@string/app_name" > </activity> <activity android:name="com.lgandroid.ddcnfc.SettingsActivity" android:label="@string/app_name"></activity> </application> 

Immer wenn ich mein Tag scanne, startet meine Haupttätigkeit, aber ich möchte meine BluePrintActivity starten. Ich bin mir nicht sicher, warum dies der Fall ist. Hier ist mein Code zum Schreiben zum Tag:

 private boolean writeTag(Tag tag) { NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); try { // see if tag is already NDEF formatted Ndef ndef = Ndef.get(tag); if (ndef != null) { ndef.connect(); if (!ndef.isWritable()) { nfcTextView.setText("Read-only tag."); return false; } // work out how much space we need for the data int size = message.toByteArray().length; if (ndef.getMaxSize() < size) { nfcTextView.setText("Tag doesn't have enough free space."); return false; } ndef.writeNdefMessage(message); nfcTextView.setText("Tag written successfully."); return true; } else { // attempt to format tag NdefFormatable format = NdefFormatable.get(tag); if (format != null) { try { format.connect(); format.format(message); nfcTextView.setText("Tag written successfully!\nClose this app and scan tag."); return true; } catch (IOException e) { nfcTextView.setText("Unable to format tag to NDEF."); return false; } } else { nfcTextView.setText("Tag doesn't appear to support NDEF format."); return false; } } } catch (Exception e) { nfcTextView.setText("Failed to write tag"); } return false; } 

Bearbeiten: Die Antwort, die ich oben akzeptiert habe, deutete mich auf die richtige Richtung an, aber da ich an einem Tag schrieb, ist der Code in der akzeptierten Antwort nicht genau die richtige Lösung. Wenn du an einen Tag schreibst, dann musst du das machen:

  NdefRecord appRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/com.lgandroid.ddcnfc".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]); NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); 

Wenn Sie eine Nutzlast speichern möchten, ersetzen Sie einfach den letzten Parameter "new byte [0]" auf eine entsprechende Daten.

  • RFID-Tags Emulation in Android Emulator
  • DES Senden und Empfangen von Modi für die DESFire-Authentifizierung
  • Android NFC writeNdefMessage wirft IOException Tag ist nicht ndef
  • So speichern Sie Daten in Secure Element in Android
  • Wie gut unterstützt das Android NFC API Mifare Desfire?
  • IOException mit Host-basierter Kartenemulation
  • Merkwürdiges Zeichen auf Android NDEF Datensatz Payload
  • Wie man einen String mit NFC von einem Windows Phone 8 zu einem Android-Gerät zu senden
  • 2 Solutions collect form web for “Starten Sie eine bestimmte Aktivität beim Scannen von NFC-Tag”

    Der Grund, warum deine App startet, ist, weil du einen Android Application Record auf den Tag schreibst. Dies führt dazu, dass die Anwendung, die einen passenden Paketnamen hat, anstelle der gefilterten Aktivität gestartet wird.

    Weil du für einen Mime-Typ filtrierst, willst du einen Mime Record mit dem Typ 'application / com.lgandroid.ddcnfc' so anlegen

     NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); 

    Du solltest benutzen:

     NdefRecord appRecord = NdefRecord.createMimeRecord("application/com.lgandroid.ddcnfc", byteArray); 

    Solange Sie nur eine AAR auf dem Tag gespeichert haben, wird Ihre Anwendung mit ihrer Standard-Aktivität (oder die aktuelle Aktivität Stack, was auch immer es ist) gestartet werden. Daher sollte der AAR der letzte Datensatz sein, der auf einem Tag gespeichert ist, nur verwendet, um die App zu identifizieren.

    Wenn Sie einen zusätzlichen NDEF-Datensatz haben, der von einer Ihrer Aktivitäten abgeglichen wird, besteht die Chance, dass die entsprechende Aktivität geöffnet wird, um das Tag zu behandeln. Allerdings zeigen meine Experimente und eine andere Frage hier , dass dieser Mechanismus nicht wie angekündigt funktioniert.

    Eine alternative Lösung könnte sein, eine URL als eine der Nachrichten auf dem Tag zu speichern, eine Webseite auf einem Server zu öffnen, den du kontrollierst (oder direkt zu Google Play).

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.