Я задаю следующий вопрос для совета, я посмотрел онлайн (и похожие вопросы здесь на stackoverflow), но решение для меня не работает.
Я пишу приложение Android (для полного раскрытия я делаю это на Xamarin - но технология должна быть неактуальной), и все, что я хочу, это показать предупреждение / всплывающее сообщение при сканировании кода NF C. Если у меня открыто приложение и я прикрепляю свой тег NF C к своему телефону, предупреждение отображается, как и ожидалось. Когда приложение было закрыто и я положил тег NF C на свой телефон, приложение открывается, но это все, что нужно.
Я довольно новичок в Android разработке (ранее я был очень универсален c при создании Android приложений через Xamarin и не очень использовал такие функции устройства, как NF C / Bluetooth) поэтому, если я упускаю что-то довольно очевидное, я прошу прощения.
using System.Text;
using Android.App;
using Android.Content;
using Android.Nfc;
using Android.OS;
using Android.Support.V7.App;
namespace Android.Demo
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true, LaunchMode = Content.PM.LaunchMode.SingleInstance)]
[IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered }, Categories = new[] { "android.intent.category.DEFAULT" }, DataMimeType = "*/*")]
public class MainActivity : AppCompatActivity
{
private NfcAdapter _nfcAdapter;
private PendingIntent _pendingIntent;
private string[][] _techList = new string[][]{
new[] { "android.nfc.tech.NdefFormatable" } ,
new [] { "android.nfc.tech.NfcA" } ,
new [] { "android.nfc.tech.Ndef" },
new [] { "android.nfc.tech.Ndef" }};
protected override void OnCreate(Bundle savedInstanceState)
{
_nfcAdapter = NfcAdapter.GetDefaultAdapter(this);
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
_pendingIntent = PendingIntent.GetActivity(this, 0, Intent, 0);
Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
}
protected override void OnPause()
{
base.OnPause();
if (_nfcAdapter != null && _nfcAdapter.IsEnabled)
_nfcAdapter.DisableForegroundDispatch(this);
}
protected override void OnResume()
{
base.OnResume();
// doStuff();
_nfcAdapter.EnableForegroundDispatch(this, _pendingIntent, new[] { new IntentFilter(NfcAdapter.ActionNdefDiscovered), new IntentFilter(NfcAdapter.ActionTechDiscovered), new IntentFilter(NfcAdapter.ActionTagDiscovered), new IntentFilter(NfcAdapter.ActionNdefDiscovered) }, _techList);
}
protected override void OnNewIntent(Intent intent)
{
var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;
if (tag != null)
{
// First get all the NdefMessage
var rawMessages = intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages);
if (rawMessages != null)
{
var msg = (NdefMessage)rawMessages[0];
// Get NdefRecord which contains the actual data
var record = msg.GetRecords()[0];
if (record != null)
{
if (record.Tnf == NdefRecord.TnfWellKnown) // The data is defined by the Record Type Definition (RTD) specification available from http://members.nfc-forum.org/specs/spec_list/
{
// Get the transfered data
var data = Encoding.ASCII.GetString(record.GetPayload());
var alert = new App.AlertDialog.Builder(this).Create();
alert.SetMessage(data);
alert.SetTitle("NFC Tag Located");
alert.Show();
}
}
}
}
}
}
}
Спасибо