Как отправить сообщение с помощью NFC с Xamarin.Android?

Я разрабатываю приложение для демонстрации работы NFC. Моя цель — создать приложение, которое будет работать очень похоже на Android Beam. Я использую Xamarin.Android. Цель состоит в том, чтобы ввести сообщение на одно устройство, нажать кнопку, и оно должно быть отправлено на другое устройство с тем же приложением, где оно должно отображаться. Я пробовал почти все, даже документацию, но похоже, что это не работает. У кого-нибудь есть опыт работы с этой технологией? Доступна ли эта технология в наши дни?

Есть часть моего кода, чтобы дать вам представление о том, что я пытаюсь сделать:

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        mNfcAdapter = NfcAdapter.GetDefaultAdapter(this);


        myButton.Click += (e, o) => { 
            mNfcAdapter.SetNdefPushMessageCallback(this, this);
            mNfcAdapter.SetOnNdefPushCompleteCallback(this, this);
            };
    }

   public NdefMessage CreateNdefMessage(NfcEvent e)
    {
        DateTime time = DateTime.Now;
        var text = (time.ToString("HH:mm:ss") + message2);
        NdefMessage msg = new NdefMessage(
        new NdefRecord[] { CreateMimeRecord (
            text, Encoding.UTF8.GetBytes (text))});
        return msg;
    }

    private NdefRecord CreateMimeRecord(string mimeType, byte[] payload)
    {
        byte[] mimeBytes = Encoding.UTF8.GetBytes(mimeType);
        NdefRecord mimeRecord = new NdefRecord(
            NdefRecord.TnfMimeMedia, mimeBytes, new byte[0], payload);
        return mimeRecord;
    }

    public void OnNdefPushComplete(NfcEvent e)
    {
        Toast.MakeText(this.ApplicationContext, "Message sent", ToastLength.Long).Show();
    }

    protected override void OnResume()
    {
        base.OnResume();
        if (NfcAdapter.ActionNdefDiscovered == Intent.Action)
        {
            ProcessIntent(Intent);
        }
    }

    protected override void OnNewIntent(Intent intent)
    {
        Intent = intent;
    }

    void ProcessIntent(Intent intent)
    {
        IParcelable[] rawMsgs = intent.GetParcelableArrayExtra(
            NfcAdapter.ExtraNdefMessages);
        NdefMessage msg = (NdefMessage)rawMsgs[0];
        var textViewMsg = FindViewById<TextView>(Resource.Id.textViewMsg);
        textViewMsg.Text = Encoding.UTF8.GetString(msg.GetRecords()[0].GetPayload());
    }

Спасибо вам всем :)


person Heidy    schedule 08.02.2021    source источник
comment
На каких версиях Android (оба телефона) вы используете это?   -  person Andrew    schedule 08.02.2021
comment
У одного андроид 11, у другого 8.   -  person Heidy    schedule 08.02.2021


Ответы (1)


OnNdefPushComplete и весь Android Beam устарел и удален из Android 10.

https://developer.android.com/reference/android/nfc/NfcAdapter.OnNdefPushCompleteCallback

Если вы хотите использовать NFC от устройства к устройству в будущем, это должно быть возможно, если один телефон выполняет эмуляцию хост-карты (HCE), а другой использует enableReaderMode.

Но Google рекомендует использовать Bluetooth или Wifi Direct как более надежную замену Android Beam. Одним из методов замены, предоставленных Google, был Android Nearby https://developers.google.com/nearby.

person Andrew    schedule 08.02.2021
comment
Вау спасибо. Это на самом деле очень полезно. Так мне нужно два приложения, чтобы сделать это? Или я могу иметь это в одном приложении? :) - person Heidy; 08.02.2021
comment
Это можно сделать в одном приложении. - person Andrew; 08.02.2021
comment
Эй, извините за беспокойство. Но знаете ли вы о каком-либо примере HCE с использованием Xamarin? Тот, который у меня есть, действительно устарел, и я не могу заставить его работать. - person Heidy; 09.02.2021