2

Ich habe eine Xamarin-App, die NFC-Tags liest. Es funktioniert einwandfrei, wenn die App geöffnet ist. Wenn die App jedoch im Hintergrund oder geschlossen ist, können die Daten nicht vom Tag gelesen werden.Das Lesen von NFC-Tags von außerhalb der App gibt keine Daten zurück

Meine Absicht Filter:

[IntentFilter(
    new[] {"android.nfc.action.NDEF_DISCOVERED", "android.intent.action.VIEW", "android.intent.action.MAIN"}, 
    Categories = 
     new[] 
     { 
      "android.intent.category.DEFAULT", "android.intent.category.BROWSABLE", 
      "android.intent.category.LAUNCHER" 
     }, 
    DataScheme = "http", DataHost = "app.myDomain.com")] 

Und in meinem OnNewIntent, mein intent.Data immer wieder als null kommt, wenn von außerhalb des App gescannt. Gibt es irgendwelche Gedanken darüber, wo mein Problem liegen könnte?

onResume:

nfcAdapter.EnableForegroundDispatch(this, nfcPendingIntent, nfcIntentFiltersArray, null); 

OnNewIntent:

protected override void OnNewIntent(Intent intent) 
{    
if (AndroidNFCHelper.isNfcIntent(intent)) 
{ 
    DisplayMessage("And it is an NFC intent"); 
} 

var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; 

if (tag == null) 
{ 
    Debug.WriteLine("tag is null"); 
    return; 
} 

//rest of OnNewIntent code... 
} 

So ist die interessante Sache, wenn sie außerhalb der App gescannt, kommt AndroidNFCHelper.isNfcIntent wieder als falsch. Wenn das gleiche NFC-Tag in der App gescannt wird, wird es als wahr zurückgegeben. Wenn Sie fortfahren, endet tag als null und trifft nur die return-Anweisung. Wenn das Tag in der App gescannt wird, ist das Tag nicht null und wird fortgesetzt.

private void PrepareForegroundNFCHandling() 
{ 

var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered); 
var ndefDetected = new IntentFilter(NfcAdapter.ActionNdefDiscovered); 

nfcIntentFiltersArray = new[] { ndefDetected, tagDetected}; 

var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop | ActivityFlags.BroughtToFront); 
nfcPendingIntent = PendingIntent.GetActivity(this, 0, intent, 0); 

nfcAdapter = NfcAdapter.GetDefaultAdapter(Application.ApplicationContext);    
} 
+0

Welche Daten (NDEF-Nachricht) haben Sie auf dem Tag gespeichert? Schlägt das Tippen auf das Tag bei geschlossener App (oder im Hintergrund) dazu bei, dass Ihre Aktivität geöffnet wird? Welchen Code haben Sie in OnCreate(), OnStart(), OnResume()? Welche Absicht.Aktion siehst du in OnNewIntent()? –

+0

Es ist nur eine URL .. etwas wie http://app.myDomain.com/p/9. Tippen mit geschlossener App öffnet die App, aber da das Tag-Objekt letztendlich null zurückkommt, passiert nichts.Ich werde den Beitrag mit dem anderen Code aktualisieren – Arthurdent510

+0

Rufen Sie OnNewIntent() von überall in Ihrem Code? Sind Sie sicher, dass Ihr Tag nur einen einzigen NDEF-Datensatz mit der URL enthält und keinen Android-Anwendungsdatensatz mit dem Namen Ihres App-Pakets enthält? –

Antwort

1

Die NDEF_DISCOVERED Absicht nur für die Art des Datensatzes NDEF in einer Tag-Nachricht des ersten Filter: -

PrepareForegroundNFCHandling wird in OnCreate() aufgerufen.

Wie Sie Ihre App mit der Absicht Aktion MAIN gestartet (AndroidNFCHelper.isNfcIntent(intent) falsch ist) und ohne Tag Objekt in der Absicht Extras (intent.GetParcelableExtra(NfcAdapter.ExtraTag) ist null), Ihre NDEF Nachricht wahrscheinlich enthält eine Applikation für Android Nehmen Sie neben der URL.

Der Grund, warum Ihre App gestartet wird, selbst wenn die NDEF-Nachricht (als erste Aufzeichnung gelesen) nicht mit Ihrem Intent-Filter übereinstimmt, ist, dass die AAR zum Starten Ihrer App zurückgreift, als ob das Launcher-Symbol angeklickt wurde Aktion MAIN, Kategorie LAUNCHER), wenn kein passender NFC-Intent-Filter vorhanden ist.

So Ihre NDEF Nachricht sieht wahrscheinlich so etwas wie folgt aus:

 
+----------------------------------------------+ 
| SOME RECORD         | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 

Oder einfach wie folgt aus:

 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 

Im ersten Fall müssten Sie die Intent-Filter zu ändern, um Ihre Aufzeichnung passen "EINIGE AUFNAHME". Im letzteren Fall müssen Sie Ihre Absicht Filter entsprechen den externen Typ ändern „android: com: pkg“:

DataScheme = "vnd.android.nfc", DataHost = "ext", DataPathPrefix = "/android.com:pkg" 

Oder, noch besser, können Sie Ihre URL an den Anfang der Nachricht NDEF bewegen und der AAR bis zum Ende der NDEF-Nachricht:

 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
Verwandte Themen