从应用程序外部读取NFC标签不会返回任何数据

时间:2016-11-29 17:58:20

标签: xamarin xamarin.android nfc ndef android-applicationrecord

我有一个正在阅读NFC标签的xamarin应用程序。应用程序打开时它可以正常工作,但如果应用程序在后台或关闭,则无法从标记中读取数据。

我的意图过滤器:

printf()

在我的OnNewIntent中,当从应用程序外部扫描时,我的intent.Data始终返回null。对我的问题可能在哪里有什么想法?

的onResume:

[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")]

OnNewIntent:

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

所以有趣的是,当在应用程序外扫描时,AndroidNFCHelper.isNfcIntent会返回false。当在应用程序中扫描相同的NFC标签时,它会恢复正常。继续,标记最终为null并且只是命中return语句。在应用程序中扫描时,标记不为空并继续。

PrepareForegroundNFCHandling - 在OnCreate()中调用:

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

1 个答案:

答案 0 :(得分:1)

NDEF_DISCOVERED意图仅过滤标记的NDEF消息中第一个记录的类型。

当您的应用程序以意图操作启动时MAIN(AndroidNFCHelper.isNfcIntent(intent)为false)并且在intent extras中没有任何Tag对象(intent.GetParcelableExtra(NfcAdapter.ExtraTag)为null),您的NDEF消息可能包含除URL之外的Android应用程序记录。

即使NDEF消息(读作"第一个记录")与您的意图过滤器不匹配,您的应用程序启动的原因是AAR将回退到启动您的应用程序,就像启动器图标一样如果没有匹配的NFC意图过滤器,则单击(即操作MAIN,类别LAUNCHER)。

所以你的NDEF消息可能看起来像这样:

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

或者只是这样:

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

在第一种情况下,您需要修改意图过滤器以匹配您的记录" SOME RECORD"。在后一种情况下,您需要修改您的intent过滤器以匹配外部类型" android:com:pkg":

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

或者,更好的是,您将URL移动到NDEF消息的开头,将AAR移动到NDEF消息的末尾:

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