我想读取一张mifare卡。我可以读取Tag对象,但不能读取NdefMessages......。当我调用意图来检索ndefMessages时,它返回一个空值,而不是一个数组。然而我可以读取ID和techlist,当我用另一个应用程序读取时,我可以看到内容,所以卡有数据。
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Nfc;
using Android.Nfc.Tech;
using Android.OS;
using Android.Runtime;
using System;
using System.Linq;
using System.Text;
namespace NfcDemo.Droid
{
[Activity(Label = "NfcDemo", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode = LaunchMode.SingleTop | LaunchMode.SingleTask)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
private NfcAdapter _nfcAdapter;
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
_nfcAdapter = NfcAdapter.GetDefaultAdapter(this);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnResume()
{
base.OnResume();
if (_nfcAdapter == null)
{
var alert = new AlertDialog.Builder(this).Create();
alert.SetMessage("NFC is not supported on this device.");
alert.SetTitle("NFC Unavailable");
alert.Show();
}
else
{
var ndefDiscover = new IntentFilter(NfcAdapter.ActionNdefDiscovered);
var techDiscover = new IntentFilter(NfcAdapter.ActionTechDiscovered);
var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered);
var filters = new[] { tagDetected, techDiscover, ndefDiscover };
var intent = new Intent(this, this.GetType()).AddFlags(ActivityFlags.SingleTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);
_nfcAdapter.EnableForegroundDispatch(this, pendingIntent, filters, null);
}
}
protected override void OnPause()
{
base.OnPause();
_nfcAdapter.DisableForegroundDispatch(this);
}
public static string ByteArrayToString(byte[] ba)
{
return BitConverter.ToString(ba).Replace("-", "");
}
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
if (intent.Action == NfcAdapter.ActionTagDiscovered)
{
var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;
if (tag != null)
{
var techs = tag.GetTechList();
var id = tag.GetId();
var hexstring = ByteArrayToString(tag.GetId());
var rawMessages = intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages);
if (rawMessages != null)
{
foreach (var message in rawMessages.Cast<NdefMessage>())
{
foreach (var record in message.GetRecords())
{
var typeBytes = record.GetTypeInfo();
var payloadBytes = record.GetPayload();
var type = Encoding.UTF8.GetString(typeBytes);
var payload = Encoding.UTF8.GetString(payloadBytes);
}
}
}
}
}
}
}
}
你应该寻找的是 NfcAdapter.ACTION_NDEF_DISCOVERED
不 NfcAdapter.ActionTagDiscovered
在你 onNewIntent
但由于您没有在您的意图过滤器中正确地要求发送NDEF消息,您不会收到任何消息,您应该添加 ndefDiscover.addDataType("*/*");
来告诉它你想要什么类型的NDEF信息,然后再将过滤器传递给 EnableForegroundDispatch
注意 "**"是发送所有类型,没有定义数据类型是发送零数据类型。
因为TagDiscovered是比NDEF更低的类型,所以即使你的卡上有NDEF消息,后台服务也不会解析它们并将其放入Extras字段,因为它不希望你使用它们。
有关这方面的文档在 https:/developer.android.comguidetopicsconnectivitynfcadvanced-nfc#foreground-dispatch。