2016-12-09 2 views
0

Ich möchte die NFC-Technologie für meine Android-Anwendung verwenden.Lesen Android NFC Tag mit unbekannten Tag Typ Xamarin - C#

Ich möchte die Benutzer in der Lage sein, eine NFC-Karte zu scannen, so dass sie sich in der Anwendung anmelden können. Die Karte enthält eine Nummer.

So ist die Idee, einfach den Code abrufen und wandeln es in String

aber ich bin immer ein Nullobjectreference

Versuch virtuelle Methode aufzurufen ‚boolean android.nfc.Tag.hasTech (int)‘auf einer null-Objektreferenz

UPDATE

Quellcode:

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> 
+0

Bitte senden Sie die Kosten https://github.com/poz1/NFCForms mit gearbeitet, was Sie versucht haben, bisher. – BytesGuy

+0

Vielen Dank für Ihre Zeit, bitte lesen Sie den Beitrag Ich aktualisierte es mit Details, Quellcode und Ausnahme –

+0

wo haben Sie den Fehler? aus 'nfcTag.GetTechList()' –

Antwort

0

Das Problem war nur auf Art von Karte zu filtern NFCA es nach für

Verwandte Themen