gpt4 book ai didi

android - NFC 上的 IntentFilter - Xamarin - C#

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:08 24 4
gpt4 key购买 nike

上下文是:Framework 4.5,Xamarin.Android v5.0

我想使用 NFC 技术为我的应用程序用户实现快捷方式。我希望用户扫描 NFC 标签,这样他们只需为预定义方案赋值即可。

我在我的 NFC 消息中加入了一些参数,当我在我的 NFC 标签上写消息时我这样做了:

    var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;
var ndef = Ndef.Get(tag);
NdefRecord external = NdefRecord.CreateExternal(applicationPackageName(), "letypetype", Encoding.ASCII.GetBytes("param"));
NdefRecord appRecord = NdefRecord.CreateApplicationRecord(applicationPackageName());
NdefMessage ndefMessage = new NdefMessage(external, appRecord);
if (ndef != null)
{
ndef.Connect();
ndef.WriteNdefMessage(ndefMessage);
}

然后,我想在我的应用程序中使用它,所以我将它放在 AndroidManifest.xml 中:

<uses-feature android:name="android.hardware.nfc" android:required="true" />

在我的主要 Activity 中,我有以下 Intent 过滤器:

     [IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered },
Categories = new[] { Intent.CategoryDefault },
DataScheme = "vnd.android.nfc", DataPathPrefix = "letypetype",
DataHost = "ext")]
public class Activity1 : Activity
{ ...

然后我尝试使用覆盖方法 OnResume 处理此 Activity 中的参数:

    protected override void OnResume()
{
base.OnResume();
if (NfcAdapter.ActionNdefDiscovered.Equals(this.Intent.Action))
{
IParcelable[] rawMsgs = this.Intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages);
if (rawMsgs != null)
{
NdefMessage[] msgs = new NdefMessage[rawMsgs.Length];
for (int i = 0; i < rawMsgs.Length; i++)
{
msgs[i] = (NdefMessage)rawMsgs[i];
}
}
}
}

但是没有办法取回。所以我很确定我做错了什么,但我不知道是什么。

最佳答案

您面临的问题是您对外部记录的 Intent 过滤器错误的结果。当前在您的案例中发生的是 Intent 过滤器

[IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered },
Categories = new[] { Intent.CategoryDefault },
DataScheme = "vnd.android.nfc",
DataPathPrefix = "letypetype",
DataHost = "ext")]

匹配您使用

创建的外部记录
NdefRecord external = NdefRecord.CreateExternal(
applicationPackageName(),
"letypetype",
Encoding.ASCII.GetBytes("param"));

相反,您的 Activity 是根据 Android 应用程序记录 (AAR) 启动的。由于没有匹配的 NFC intent 过滤器,Android 不知道您的 Activity 支持 NFC,因此不会将标签(及其 NDEF 消息)传递给您的 Activity。

为了在您的 Activity 中接收 NDEF 消息/标签句柄,您因此需要更新 Intent 过滤器以匹配外部记录。如果应用程序的包名称是“com.example”,那么您的 Intent 过滤器需要如下所示:

[IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered },
Categories = new[] { Intent.CategoryDefault },
DataScheme = "vnd.android.nfc",
DataPathPrefix = "/com.example:letypetype",
DataHost = "ext")]

请注意,域字段和前导斜杠需要包含在 DataPathPrefix 属性中。

另请注意(虽然这通常有效)根据 NFC 论坛的外部类型规范,Java/Android 包名称不是有效域名。相反,您应该使用真实的域名(例如“example.com”)。

最后:不要忘记在 list 中请求 NFC 权限:

<uses-permission android:name="android.permission.NFC" />

关于android - NFC 上的 IntentFilter - Xamarin - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33413007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com