从应用外部读取 NFC 标签 returns 无数据

Reading NFC tags from outside of app returns no data

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

我的意图过滤器:

[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 标签时,它返回为真。继续,标记最终为 null 并恰好命中 return 语句。在应用程序中扫描时,标签不为空并继续。

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_DISCOVERED 意图仅过滤标签的 NDEF 消息中 第一个 记录的类型。

当您的应用程序以 intent 操作 MAIN(AndroidNFCHelper.isNfcIntent(intent) 为假)启动并且在 intent extras 中没有任何 Tag 对象(intent.GetParcelableExtra(NfcAdapter.ExtraTag) 为空)时,您的 NDEF 消息可能除了 URL.

之外还包含一个 Android 申请记录

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

因此您的 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       |
+----------------------------------------------+

在第一种情况下,您需要修改 intent 过滤器以匹配您的记录 "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 |
+----------------------------------------------+