我有一个正在阅读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...
}
答案 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 | +----------------------------------------------+