android — NFC with Xamarin.Forms nothing happens — Stack Overflow

Github — sorinmiroiu97/xamarin-nfc-app: android app written in c# using the xamarin framework

This is a ready to use app written in C#, using the Xamarin framework. It is compatible with the Android devices startging from 2.3 (gingerbread). This is a sample showing how to use the NFC library within the Android framework and you can in this app write anything you want into an NFC chip (by typing into the EditText) and read anything you want from an NFC chip.

Read android nfc tag with unknown tag type xamarin — c#

I want to use the NFC technology for my Android application.

I want the users to be able to scan an NFC card so they can log in to the application. The card contains a number.

So the idea is just to retrieve the code and convert it to string

but I’m getting an Nullobjectreference

Attempt to invoke virtual method ‘boolean
android.nfc.Tag.hasTech(int)’ on a null object reference

UPDATE

Source code:

using System;
using System.Text;
using Android.App;
using Android.Nfc;
using Android.OS;
using Android.Widget;
using Android.Content;
using Android.Nfc.Tech;
namespace NFC_NDEF
{
[Activity(Label = "NFC_NDEF_TST", MainLauncher = true, Icon = "@drawable/icon")]
[IntentFilter(new[] { NfcAdapter.ActionTechDiscovered })]
public class MainActivity : Activity
{
NfcAdapter nfcAdapter;
PendingIntent nfcPi;
IntentFilter nfcFilter;
Tag nfcTag;
string newLine = System.Environment.NewLine;
protected override void OnCreate(Bundle bundle)
{ base.OnCreate(bundle); SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button btnScan = FindViewById<Button>(Resource.Id.MyButton); btnScan.Click = Scan; //var writerButton = FindViewById<Button>(Resource.Id.WriteButton); //writerButton.Click = Write; var label = FindViewById<TextView>(Resource.Id.textView_rslt); nfcAdapter = NfcAdapter.GetDefaultAdapter(ApplicationContext); if (nfcAdapter == null) { label.Text = "NFC is not available."; return; } if (!nfcAdapter.IsEnabled) { label.Text = "NFC is disabled."; return; } var intent = new Intent(this, this.Class); intent.AddFlags(ActivityFlags.SingleTop); nfcPi = PendingIntent.GetActivity(this, 0, intent, 0); nfcFilter = new IntentFilter(NfcAdapter.ActionTechDiscovered); nfcFilter.AddCategory(Intent.CategoryDefault);
}
private void Scan(object sender, EventArgs e)
{ var label = FindViewById<TextView>(Resource.Id.textView_rslt); try { if (nfcTag == null) { label.Text = "nfc tag is null"; return; } var ndef = Ndef.Get(nfcTag); ndef.Connect(); var data = Encoding.UTF8.GetString(ndef.NdefMessage.ToByteArray()); ndef.Close(); label.Text = $"Data:{newLine}{data}"; } catch (Exception ex) { label.Text = $"{newLine} Exception: {newLine} {ex.Message} {newLine} {ex.StackTrace}"; }
}
protected override void OnResume()
{ base.OnResume(); nfcAdapter.EnableForegroundDispatch(this, nfcPi, new IntentFilter[] { nfcFilter }, null); if (NfcAdapter.ActionTechDiscovered == Intent.Action) { ProcessIntent(Intent); }
}
protected override void OnNewIntent(Intent intent)
{ base.OnNewIntent(intent); Intent = intent; if (NfcAdapter.ActionTechDiscovered == intent.Action) { ProcessIntent(Intent); }
}
private void ProcessIntent(Intent intent)
{ var label = FindViewById<TextView>(Resource.Id.textView_rslt); try { nfcTag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; label.Text = $"Id: 0x{Smartisan.Nfc.Utils.ByteToHex(nfcTag.GetId())}"; label.Text = $"{newLine}Techs: {newLine}"; label.Text = string.Join(newLine, nfcTag.GetTechList()); } catch (Exception ex) { label.Text = $"{newLine} Exception: {newLine} {ex.Message} {newLine} {ex.StackTrace}"; }
}
}
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="NFC_NDEF.NFC_NDEF" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> <uses-sdk android:minSdkVersion="16" /> <uses-permission android:name="android.permission.NFC" /> <uses-sdk android:targetSdkVersion="15" /> <uses-feature android:name="android.hardware.nfc" android:required="true" />
<application android:label="NFC_NDEF"></application>
</manifest>
Проблемы NFC:  Красивые номера и выгодные тарифы от мгтс

Trying to implement nfc in xamarin forms

@ross, I use Alessandro Pozone plugin and for me it works well.
In github repository you find an «Example» directory. In «NFCFormSample» directory there is a NFCPage.cs file that «read» the NFC and display its values.
If you run this example, put a breakpoint in HandleNewTag method. In «e» parameter you should find all you need about your NFC

Have a nice day
Alessandro

Xamarin.android — как вы отправляете сообщение, используя 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()); }

Спасибо всем 🙂

Проблемы NFC:  Как привязать карту сбербанка к телефону через смартфон, как подключить ее в телефоне и сохранить возможность оплаты через NFC

Лучший ответ

Код, который вы пытаетесь реализовать, не будет работать с устройствами с Android 10 и более поздних версий, поскольку OnNdefPushComplete был устарел. Вместо этого вы можете использовать writeNdefMessage и getNdefMessage. Ссылка: Ndef docs

Хорошая часть состоит в том, что вы можете легко, используя эти методы, внедряйте его внутри одного приложения, без необходимости 2 отдельных приложений.

Если вы обнаружите какие-либо проблемы с его реализацией, вы можете обратиться к отличному демонстрационному / образцу приложения Xamarin от Franck Bour — Плагин.NFC. Есть код для реализации как для Android, так и для iOS для записи и чтения данных NFC, а также отличное демонстрационное решение.

Оцените статью
NFC в смартфонах