将旧版 Xamarin Android 代码集成到 .NET Maui 中

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

我使用以下旧代码 (Xamarin.Android) 作为用 Xamarin.Forms 编写的资产管理应用程序的免费应用程序。我正在尝试更新 Xamarin.Forms 应用程序并将 Xamarin.Android 代码集成到新的 .NET Maui 版本中,但很难找到如何集成平台特定代码的示例。

任何帮助表示赞赏。 谢谢 保罗。

namespace NfcGuidWriter
{
    using Android.App;
    using Android.Content;
    using Android.Nfc;
    using Android.Nfc.Tech;
    using Android.OS;
    using Android.Views;
    using Android.Widget;
    using System;
    using System.Linq;

    [Activity(Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {

        //--------------------------------------------------------------------------------------------------------------------------------------------

        public static readonly string Tag = "NFC Guid Writer";

        private bool inWriteMode;
        private NfcAdapter nfcAdapter;
        private TextView textInfo; //will need refactoring
        private Button writeTagButton;

        //--------------------------------------------------------------------------------------------------------------------------------------------

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.MainActivity);

            // Get a reference to the default NFC adapter for this device. This adapter 
            // is how an Android application will interact with the actual hardware.
            nfcAdapter = NfcAdapter.GetDefaultAdapter(this);

            writeTagButton = FindViewById<Button>(Resource.Id.button_write_tag);
            writeTagButton.Click += OnClickWriteTagButton;

            textInfo = FindViewById<TextView>(Resource.Id.tv_info);
        }

        //--------------------------------------------------------------------------------------------------------------------------------------------

        /// <summary>
        /// This method is called when an NFC tag is discovered by the application.
        /// </summary>
        /// <param name="intent"></param>
        protected override void OnNewIntent(Intent intent)
        {

            try
            {

                if (inWriteMode)
                {

                    inWriteMode = false;

                    Tag tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;

                    byte[] id = tag.GetId();

                    NfcV nfcvTag = NfcV.Get(tag);

                    int[] intArray = new int[36];

                    // 4d196b8c-aa42-4f90-924f-b953654c31f7 (Length = 36)
                    string guidStr = Guid.NewGuid().ToString();

                    char[] guidChars = guidStr.ToCharArray();

                    for (int i = 0; i < guidChars.Count(); i++)
                    {
                        int value = Convert.ToInt32(guidChars[i]);
                        intArray[i] = value;
                    }

                    if (nfcvTag != null)
                    {

                        nfcvTag.Connect();

                        // 0x20 with id (UID) works! (addressed v non addressed using 0,0,0,0,0,0,0,0)

                        //---------------------------------------------------------------------------------------

                        // E1 40 0E 00
                        byte[] cmd0 = new byte[] {
                        /* FLAGS   */ (byte)0x20, // 0x00 0x20 0x22 0x40 0x42 ????
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x00,
                        /* DATA    */ (byte)0xE1, (byte)0x40, (byte)0x0E, (byte)0x00
                        };

                        Array.Copy(id, 0, cmd0, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // 03 2B D1 01
                        byte[] cmd1 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x01,
                        /* DATA    */ (byte)0x03, (byte)0x2B, (byte)0xD1, (byte)0x01
                        };

                        Array.Copy(id, 0, cmd1, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // 27 54 02 65
                        byte[] cmd2 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x02,
                        /* DATA    */ (byte)0x27, (byte)0x54, (byte)0x02, (byte)0x65
                        };

                        Array.Copy(id, 0, cmd2, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // 6E XX XX XX
                        byte[] cmd3 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x03,
                        /* DATA    */ (byte)0x6E, (byte)intArray[0], (byte)intArray[1], (byte)intArray[2]
                        };

                        Array.Copy(id, 0, cmd3, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd4 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x04,
                        /* DATA    */ (byte)intArray[3], (byte)intArray[4], (byte)intArray[5], (byte)intArray[6]
                        };

                        Array.Copy(id, 0, cmd4, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd5 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x05,
                        /* DATA    */ (byte)intArray[7], (byte)intArray[8], (byte)intArray[9], (byte)intArray[10]
                        };

                        Array.Copy(id, 0, cmd5, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd6 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x06,
                        /* DATA    */ (byte)intArray[11], (byte)intArray[12], (byte)intArray[13], (byte)intArray[14]
                        };

                        Array.Copy(id, 0, cmd6, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd7 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x07,
                        /* DATA    */ (byte)intArray[15], (byte)intArray[16], (byte)intArray[17], (byte)intArray[18]
                        };

                        Array.Copy(id, 0, cmd7, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd8 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x08,
                        /* DATA    */ (byte)intArray[19], (byte)intArray[20], (byte)intArray[21], (byte)intArray[22]
                        };

                        Array.Copy(id, 0, cmd8, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd9 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x09,
                        /* DATA    */ (byte)intArray[23], (byte)intArray[24], (byte)intArray[25], (byte)intArray[26]
                        };

                        Array.Copy(id, 0, cmd9, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd10 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x0A,
                        /* DATA    */ (byte)intArray[27], (byte)intArray[28], (byte)intArray[29], (byte)intArray[30]
                        };

                        Array.Copy(id, 0, cmd10, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd11 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x0B,
                        /* DATA    */ (byte)intArray[31], (byte)intArray[32], (byte)intArray[33], (byte)intArray[34]
                        };

                        Array.Copy(id, 0, cmd11, 2, 8);

                        //---------------------------------------------------------------------------------------

                        // XX XX XX XX
                        byte[] cmd12 = new byte[] {
                        /* FLAGS   */ (byte)0x20,
                        /* COMMAND */ (byte)0x21,
                        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        /* OFFSET  */ (byte)0x0C,
                        /* DATA    */ (byte)intArray[35], (byte)0x00, (byte)0x00, (byte)0x00
                        };

                        Array.Copy(id, 0, cmd12, 2, 8);

                        //---------------------------------------------------------------------------------------

                        byte[] response0 = nfcvTag.Transceive(cmd0);
                        byte[] response1 = nfcvTag.Transceive(cmd1);
                        byte[] response2 = nfcvTag.Transceive(cmd2);
                        byte[] response3 = nfcvTag.Transceive(cmd3);
                        byte[] response4 = nfcvTag.Transceive(cmd4);
                        byte[] response5 = nfcvTag.Transceive(cmd5);
                        byte[] response6 = nfcvTag.Transceive(cmd6);
                        byte[] response7 = nfcvTag.Transceive(cmd7);
                        byte[] response8 = nfcvTag.Transceive(cmd8);
                        byte[] response9 = nfcvTag.Transceive(cmd9);
                        byte[] response10 = nfcvTag.Transceive(cmd10);
                        byte[] response11 = nfcvTag.Transceive(cmd11);
                        byte[] response12 = nfcvTag.Transceive(cmd12);

                        //---------------------------------------------------------------------------------------

                        nfcvTag.Close();

                    }

                    DisplayMessage("Guid (" + guidStr + ") written to tag.");

                }

            }
            catch (Exception ex)
            {
                DisplayMessage("Exception - " + ex.Message);
            }

        }

        //--------------------------------------------------------------------------------------------------------------------------------------------

        protected override void OnPause()
        {
            base.OnPause();
            // App is paused, so no need to keep an eye out for NFC tags.
            if (nfcAdapter != null)
                nfcAdapter.DisableForegroundDispatch(this);
        }

        //--------------------------------------------------------------------------------------------------------------------------------------------

        /// <summary>
        /// Displays the message into a text view and into a new toast.
        /// </summary>
        /// <param name="ndefMessage">Message.</param>
        private void DisplayMessage(string ndefMessage)
        {
            textInfo.Text = ndefMessage;
            Toast.MakeText(this, ndefMessage, ToastLength.Long).Show();
        }

        //--------------------------------------------------------------------------------------------------------------------------------------------

        /// <summary>
        /// Identify to Android that this activity wants to be notified when 
        /// an NFC tag is discovered. 
        /// </summary>
        private void EnableWriteMode()
        {
            inWriteMode = true;
            
            // Create an intent filter for when an NFC tag is discovered. 
            var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered);
            var filters = new[] { tagDetected };

            // When an NFC tag is detected, Android will use the PendingIntent to come back to this activity.
            // The OnNewIntent method will invoked by Android.
            var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.Mutable);

            if (nfcAdapter == null)
            {
                var alert = new AlertDialog.Builder(this).Create();
                alert.SetMessage("NFC is not supported on this device");
                alert.SetTitle("NFC Unavailable");
                alert.SetButton("OK", delegate
                {
                    writeTagButton.Enabled = false;
                    textInfo.Text = "NFC is not supported on this device";
                });
                alert.Show();
            }
            else
                nfcAdapter.EnableForegroundDispatch(this, pendingIntent, filters, null);
            
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------

        private void OnClickWriteTagButton(object sender, EventArgs eventArgs)
        {
            var view = (View)sender;
            if (view.Id == Resource.Id.button_write_tag)
            {
                DisplayMessage("Click the button then hold the ISO 15693 tag against the device to write.");
                EnableWriteMode();
            }
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------

    }

}

c# xamarin.forms xamarin.android maui
1个回答
0
投票

我正在尝试更新 Xamarin.Forms 应用程序并将 Xamarin.Android 代码集成到新的 .NET Maui 版本中,但很难找到如何集成平台特定代码的示例。

嗯,关于在 MAUI Android 上使用 NFC,您可以参考问答中的案例:NFC 插件或库用于 .NET Maui Android? 以及本教程:NFC NDEF 与 MAUI 和 Xamarin.Forms 通信

希望这些可以帮助到你。

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