安卓阅读Mifare经典卡

问题描述 投票:0回答:1

我想读取一张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);
                            }
                        }
                    }
                }
            }
        }
    }
}
android xamarin.android nfc
1个回答
0
投票

你应该寻找的是 NfcAdapter.ACTION_NDEF_DISCOVEREDNfcAdapter.ActionTagDiscovered 在你 onNewIntent

但由于您没有在您的意图过滤器中正确地要求发送NDEF消息,您不会收到任何消息,您应该添加 ndefDiscover.addDataType("*/*"); 来告诉它你想要什么类型的NDEF信息,然后再将过滤器传递给 EnableForegroundDispatch

注意 "**"是发送所有类型,没有定义数据类型是发送零数据类型。

因为TagDiscovered是比NDEF更低的类型,所以即使你的卡上有NDEF消息,后台服务也不会解析它们并将其放入Extras字段,因为它不希望你使用它们。

有关这方面的文档在 https:/developer.android.comguidetopicsconnectivitynfcadvanced-nfc#foreground-dispatch。

© www.soinside.com 2019 - 2024. All rights reserved.