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

Xamarin 从应用程序外部读取NFC标记不会返回任何数据,xamarin,xamarin.android,nfc,ndef,android-applicationrecord,Xamarin,Xamarin.android,Nfc,Ndef,Android Applicationrecord,我有一个xamarin应用程序正在读取NFC标签。当应用程序处于打开状态时,它可以正常工作,但如果应用程序处于后台或关闭状态,则无法从标记读取数据 我的意图过滤器: [IntentFilter( new[] {"android.nfc.action.NDEF_DISCOVERED", "android.intent.action.VIEW", "android.intent.action.MAIN"}, Categories = new[]

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

我的意图过滤器:

[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中,我的intent.Data在从应用程序外部扫描时总是返回为null。有没有想过我的问题可能在哪里

简历:

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...
}
所以有趣的是,当在应用程序外部扫描时,AndroidNFCHelper.isNfcIntent返回为false。当在应用程序中扫描相同的NFC标签时,返回为true。继续,标记以null结束,并只点击return语句。在应用程序中扫描时,标记不为空并继续

PrepareForegroundNFCHandling-在OnCreate()中调用:


NDEFèU查找到的意图仅筛选标记NDEF消息中第一条记录的类型

由于您的应用程序是以intent action MAIN(
AndroidNFCHelper.isNfcIntent(intent)
为false)启动的,并且intent extras中没有任何
Tag
对象(
intent.GetParcelableExtra(NfcAdapter.ExtraTag)
为null),因此您的NDEF消息可能除了URL之外还包含一条Android应用程序记录

即使NDEF消息(读作“第一条记录”)与您的意图过滤器不匹配,您的应用程序也会启动的原因是,如果没有匹配的NFC意图过滤器,AAR将退回到启动您的应用程序,就好像单击了启动器图标一样(即操作主、类别启动器)

因此,您的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 | +----------------------------------------------+ 或者,更好的做法是,将URL移到NDEF消息的开头,将AAR移到NDEF消息的结尾:

+----------------------------------------------+ | WKT: URI | http://app.mydomain.com/p/9 | +----------------------------------------------+ | EXTERNAL: android.com:pkg | com.mydomain.app | +----------------------------------------------+ +----------------------------------------------+ |WKT:URI|http://app.mydomain.com/p/9 | +----------------------------------------------+ |外部:android.com:pkg | com.mydomain.app| +----------------------------------------------+
您在标签上存储了哪些数据(NDEF消息)?当你的应用程序关闭(或在后台)时点击标签是否会导致你的活动被打开?在OnCreate()、OnStart()和OnResume()中有什么代码?您在OnNewIntent()中看到了什么intent.Action?它只是一个url。。差不多。在应用程序关闭的情况下点击会打开应用程序,但由于标记对象最终返回空值,因此不会发生任何事情。我会用另一个代码更新帖子你在代码中的任何地方调用OnNewIntent()吗?你确定你的标签只包含一个带有URL的NDEF记录,并且它不包含带有你的应用程序包名称的Android应用程序记录吗?所以我能够解决这个问题。。。最后,我的nfc标记被编码为包名为记录0,url为记录1。我把它们翻转过来,它神奇地开始工作。。。
DataScheme = "vnd.android.nfc", DataHost = "ext", DataPathPrefix = "/android.com:pkg"
+----------------------------------------------+ | WKT: URI | http://app.mydomain.com/p/9 | +----------------------------------------------+ | EXTERNAL: android.com:pkg | com.mydomain.app | +----------------------------------------------+