从应用外读取NFC标签无法返回数据

3
我是一个有用的助手,可以翻译文本。
我有一个使用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始终返回为空。您认为我的问题可能出在哪里吗?
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...
}

所以有趣的事情是,当在应用程序外部扫描时,AndroidNFCHelper.isNfcIntent返回false。当在应用程序中扫描相同的NFC标签时,它会返回true。继续进行,标签最终为null并且只是命中了return语句。当在应用程序中扫描时,标签不为null并继续执行。
PrepareForegroundNFCHandling - 在OnCreate()中被调用:
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);            
}

你在标签上存储了什么数据(NDEF消息)?当你的应用程序关闭(或在后台运行)时,轻敲标签会导致你的活动被打开吗?你在OnCreate()、OnStart()、OnResume()中有什么代码?你在OnNewIntent()中看到了什么intent.Action? - Michael Roland
这只是一个URL,类似于http://app.myDomain.com/p/9。在应用程序关闭的情况下点击会打开应用程序,但由于标签对象最终返回null,因此什么也不会发生。我将使用其他代码更新帖子。 - Arthurdent510
你在代码中的任何地方都调用了OnNewIntent()吗?你确定你的标签只包含一个带有URL的NDEF记录,并且不包含具有你应用程序包名称的Android应用程序记录吗? - Michael Roland
所以我解决了这个问题...最终发现我的NFC标签编码中包名是记录0,URL是记录1。我交换了它们的位置,然后奇迹般地开始工作了... - Arthurdent510
1个回答

2
NDEF_DISCOVERED 意图仅过滤标签的 NDEF 消息中的第一个记录类型。
由于您的应用程序是通过意图操作 MAIN 启动的(`AndroidNFCHelper.isNfcIntent(intent)` 为 false),并且意图附加项中没有任何 Tag 对象(`intent.GetParcelableExtra(NfcAdapter.ExtraTag)` 为 null),所以您的 NDEF 消息可能除了 URL 之外还包含 Android 应用程序记录。
即使 NDEF 消息(读作“第一个记录”)不匹配意图过滤器,您的应用程序也会启动的原因是如果没有匹配的 NFC 意图过滤器,AAR 将回退到启动您的应用程序,就像单击启动器图标一样(即操作 MAIN,类别 LAUNCHER)。
因此,您的 NDEF 消息可能如下所示:
或者简单地像这样:
在第一种情况下,您需要修改意图过滤器以匹配记录“SOME RECORD”。在后一种情况下,您需要修改意图过滤器以匹配外部类型“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 |
+----------------------------------------------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接