Die NFC-Tag-Erkennung ruft onNewIntent nicht auf und startet von der Hauptaktivität

8

Ich bin neu in NFC. Ich habe versucht, eine Verbindung mit NFC herzustellen und die Textdaten von einem Gerät an ein anderes Gerät zu senden.

Ich installiere meine Anwendung auf beiden Geräten und in einem Gerät öffne ich meine Anwendung und fange an, das Gerät auf das andere Gerät zu tippen, um Daten über Beam zu übertragen.

Auf dem anderen Gerät wird meine Anwendung aufgrund der Beam-Interaktion geöffnet. Die Aktivität wird jedoch mit der Standardaktion MAIN-Absicht und nicht mit TAG_DISCOVERED (oder einer ähnlichen NFC-Absicht) gestartet. Jedes Mal, wenn es dasselbe tut.

Außerdem ruft es nicht die Methode onNewIntent() auf. Ich habe versucht, onNewIntent von onCreate aufzurufen, aber die Absichtsaktion ist in diesem Fall immer noch MAIN. Ich erwartete, eine NFC-Absicht für die Strahlinteraktion zu erhalten. Kannst du mir bitte sagen, wo ich falsch gelaufen bin?

In diesem Code teile ich die Daten nicht. Ich brauche nur das Etikett zuerst.

Manifest:

%Vor%

Java-Code:

%Vor%     
android_dev 20.03.2014, 11:27
quelle

1 Antwort

25

Aus dem Code, den Sie in Ihrer Frage gepostet haben, gehe ich davon aus, dass Sie Ihre Anwendung nicht registriert haben, um eine bestimmte NDEF-Nachricht zu senden. Wenn Ihre App auf einem Gerät geöffnet ist, wird Android automatisch eine NDEF-Nachricht mit einem URI-Datensatz mit dem Play Store-Link Ihrer App und einem Android-Anwendungsdatensatz (AAR) auf das andere Gerät übertragen.

Ihr zweites Gerät wird die folgende NDEF-Nachricht erhalten:

%Vor%

Was jetzt passiert, wenn Ihre App nicht bereits auf dem zweiten Gerät geöffnet ist, ist, dass der Android-Anwendungsdatensatz (zweiter Datensatz) das Starten Ihrer App erzwingt. Wenn Sie sich jedoch Ihr Manifest ansehen, verfügen Sie nicht über einen Intent-Filter, der mit dem ersten Datensatz dieser NDEF-Nachricht (der Play Store-URL) übereinstimmt. Folglich denkt Android, dass Sie keine NDEF-Nachricht erwarten und verwendet den Standard android.intent.action.MAIN (mit der Kategorie android.intent.category.LAUNCHER ) zum Starten Ihrer App (bzw. der ersten Aktivität Ihrer App mit einem Intent-Filter für die Aktion MAIN mit Kategorie LAUNCHER ).

Um eine NFC-Absicht zusammen mit der gesamten NDEF-Nachricht in Ihrer App zu erhalten, müssen Sie einen richtigen Intent-Filter definieren, der mit dem ersten Datensatz in der obigen NDEF-Nachricht übereinstimmt:

%Vor%

Nun erkennt Android, dass Ihre App / Aktivität bereit ist, eine NFC-Absicht zu erhalten und die NDEF_DISCOVERED Absicht an Ihre Aktivität weiterzugeben. Beachten Sie, dass Sie diese Absicht weiterhin nicht über onNewIntent() erhalten, wenn Ihre App nicht bereits ausgeführt wird. Stattdessen können Sie die Absicht, mit der Ihre Aktivität gestartet wurde, mit der getIntent() -Methode der Aktivität abrufen. Z.B. in onCreate / onStart / onResume könnten Sie

verwenden %Vor%

um die Absicht und die NDEF-Nachricht zu erhalten.

Was die Absichtsfilter betrifft, die Sie bereits in Ihrem Manifest haben:

  1. NDEF_DISCOVERED :

    %Vor%

    Ein NDEF_DISCOVERED Intent-Filter ohne <data ... /> -Tag wird niemals auf vielen NFC-Geräten ausgelöst. Sie sollten immer definieren, welche spezifischen Daten im Node-Startdatensatz vorhanden sein sollen.

  2. TECH_DISCOVERED :

    %Vor%

    Sie sollten diesen Intent-Filter nur verwenden, wenn Ihre Anwendung beim Erkennen einer bestimmten NFC-Tag-Technologie gestartet werden soll (Sie definieren die spezifischen Technologien in der nfc_tech_filter.xml -Datei. Für Ihr Beam-Szenario würden Sie nicht verwenden Ein solcher Intent-Filter, zum Beispiel das <category ...> -Tag wird nicht für diesen Intent-Filter verwendet.

  3. TAG_DISCOVERED :

    %Vor%

    Dieser Intent-Filter sollte normalerweise nicht im Manifest verwendet werden. Es ist als Fallback gedacht, das ausgelöst wird, wenn keine andere App möglicherweise ein gefundenes NFC-Tag verarbeiten kann. Dies kann zu einer schlechten Benutzererfahrung führen (z. B. wenn Ihre App für Tags gestartet wird, die sie nicht bearbeiten kann oder möchte). Es ist hauptsächlich für Abwärtskompatibilität mit API-Ebene 9 (?) Verfügbar.

Um die NFC-Intents auch dann abzufangen, wenn Ihre Aktivität bereits gestartet wurde, könnten Sie sich für den Vordergrundversand wie folgt registrieren (in der Methode onResume ):

%Vor%

Auf diese Weise erhalten Sie alle NFC-Erkennungsereignisse, die auftreten, während Ihre Aktivität in der onNewIntent -Methode Ihrer Aktivität im Vordergrund steht. Sie werden über eine ACTION_TAG_DISCOVERED Absicht versendet.

    
Michael Roland 03.04.2014 15:36
quelle