当前位置: 首页 > 知识库问答 >
问题:

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

濮俭
2023-03-14

我有一个读取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")]

在我的帐篷里,我的意图。当从应用程序外部扫描数据时,数据总是返回为空。有没有想过我的问题可能在哪里?

简历:

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

温恩特:

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的结果是错误的。当同一个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);            
}

共有1个答案

段干河
2023-03-14

NDEF_仅对标记的NDEF消息中第一条记录的类型进行筛选。

由于您的应用程序是以意图操作MAIN(Android NFCHelper.isNfcIntent(意图)为false)启动的,并且在意图附加项中没有任何Tag对象(意图。GetParcelableExtra(NfcAdapter. ExtraTag)为null),您的NDEF消息除了URL之外可能还包含一个Android应用程序记录。

即使NDEF消息(读作“first record”)与您的意向过滤器不匹配,您的应用程序也会启动的原因是,如果没有匹配的NFC意向过滤器,AAR将退回到启动应用程序,就像单击了启动器图标一样(即action MAIN,category 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”。在后一种情况下,需要修改意图过滤器以匹配外部类型“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 |
+----------------------------------------------+
 类似资料:
  • 大家好,我正在开发android应用程序,需要扫描设备的nfc标签。我对nfc一无所知,在阅读了大量教程后,我找到了一些方法来检查手机中是否启用了nfc,但我不知道如何读取nfc标签。 这是我的promise 我的帐篷

  • 我已经制作了一个在NFC TAG上读写的应用程序。但是,当我在打开应用程序后扫描空 NFC 标签时,它没有像我预期的那样响应,因为我的应用程序吐司消息“标签为空”。但是,当我关闭我的应用程序时,我会收到移动传送带消息。 基本上,我需要如下帮助: 从我的应用程序中检测空NFC标签 在该空标记中写入服务器信息 然后从该标签中读取该信息 我在这里包含了我的代码。 Android清单.xml activi

  • 我有一个小项目要将数据写入Ntag 213、215和216。 我成功地使用MifareUltraLight方法写入数据。问题是当我使用 NfcTools 扫描时,数据格式与我预期的不同。 这是我期望的格式。 这是我得到的格式。 我希望当Ntag扫描时,如果没有安装应用程序,它会打开浏览器。 我使用Mi的方法,因为N标签将受密码保护。我尝试了两种不同的方式来写入数据。 > 我使用命令N瘤手动处理写入

  • 我正在尝试使用nfc android库读取ISO15693 RFID标签: 有关该标签的更多信息如下:http://img42.com/gw07d+

  • 我在这里找到了一些关于使用Android阅读NFC标签的最近帖子。我得到的结论是,执行NFC读取动作会触发一个分离的意图。 那么第一个问题:在我的清单中列出意图过滤器是否必要? 我认为这是没有必要的,因为我不想推出我的应用程序通过NFC标签事件,对吗? 第二个问题:我如何保持我的NFC阅读逻辑/功能与我的app/活动相关? 例如,在iOS中,在VC中需要时有一个简单的NFC会话。

  • 我是springboot的新手,我正在尝试从application.properties文件的位置(src/main/resources)读取属性值。但它总是返回NULL。我也需要帮助。附加类和属性文件。请注意:我试过“https://www.baeldung.com/properties-with-spring”如何访问Spring Boot中application.properties文件中定