IntentFilter en NFC – Xamarin – C #

El contexto es: Framework 4.5, Xamarin.Android v5.0

Quiero utilizar la tecnología NFC para implementar accesos directos para los usuarios de mi aplicación. Quiero que los usuarios analizar una etiqueta NFC por lo que sólo tiene que poner un valor a un esquema predefinido.

He puesto algunos argumentos en mi mensaje NFC y lo hago cuando escribo el mensaje en mi etiqueta NFC:

var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; var ndef = Ndef.Get(tag); NdefRecord external = NdefRecord.CreateExternal(applicationPackageName(), "letypetype", Encoding.ASCII.GetBytes("param")); NdefRecord appRecord = NdefRecord.CreateApplicationRecord(applicationPackageName()); NdefMessage ndefMessage = new NdefMessage(external, appRecord); if (ndef != null) { ndef.Connect(); ndef.WriteNdefMessage(ndefMessage); } 

Entonces, quiero usarlo en mi aplicación, así que lo he puesto en AndroidManifest.xml esto:

 <uses-feature android:name="android.hardware.nfc" android:required="true" /> 

Y en mi actividad principal tengo el siguiente filtro de intenciones:

  [IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered }, Categories = new[] { Intent.CategoryDefault }, DataScheme = "vnd.android.nfc", DataPathPrefix = "letypetype", DataHost = "ext")] public class Activity1 : Activity { ... 

Y trato de manejar mi parámetro en esta actividad con el método de reemplazo OnResume:

  protected override void OnResume() { base.OnResume(); if (NfcAdapter.ActionNdefDiscovered.Equals(this.Intent.Action)) { IParcelable[] rawMsgs = this.Intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages); if (rawMsgs != null) { NdefMessage[] msgs = new NdefMessage[rawMsgs.Length]; for (int i = 0; i < rawMsgs.Length; i++) { msgs[i] = (NdefMessage)rawMsgs[i]; } } } } 

Pero no hay forma de recuperarlo. Así que estoy bastante seguro de hacer algo mal, pero no sé qué.

Si bien entiendo la pregunta (si no me corrige por favor), el problema es leer los datos de la etiqueta? Pruebe la primera lectura simple a través de EnableForegroundDispatch y OnNewIntent y luego personalizar para sus necesidades.

 private NfcAdapter mNfcAdapter; 

En Actividad OnCreate

  mNfcAdapter = NfcAdapter.GetDefaultAdapter(this); 

En Actividad OnResume

 if (mNfcAdapter != null) { var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered);//or try other Action type var filters = new[] { tagDetected }; var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop); var pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0); mNfcAdapter.EnableForegroundDispatch(this, pendingIntent, filters, null); } 

Y demasiado

  protected override void OnNewIntent(Intent intent) { object obj = intent.GetParcelableExtra(NfcAdapter.ExtraTag); if (obj != null && obj is Tag) { Tag t = (Tag)obj; byte[] id = t.GetId(); string[] techList = t.GetTechList(); int con = t.DescribeContents(); string objName = t.ToString(); } } 

no lo olvides en OnPause

 if (mNfcAdapter != null) mNfcAdapter.DisableForegroundDispatch(this); 

y OnDestroy

 if (mNfcAdapter != null) { mNfcAdapter.Dispose(); mNfcAdapter = null; } 

El problema que enfrenta es el resultado de su filtro de intención incorrecta para el registro externo. Lo que sucede actualmente en su caso es que el filtro de intenciones

 [IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered }, Categories = new[] { Intent.CategoryDefault }, DataScheme = "vnd.android.nfc", DataPathPrefix = "letypetype", DataHost = "ext")] 

no coincide con el registro externo que creó utilizando

 NdefRecord external = NdefRecord.CreateExternal( applicationPackageName(), "letypetype", Encoding.ASCII.GetBytes("param")); 

En su lugar, su actividad se inicia debido al Registro de aplicaciones de Android (AAR). Como no hay ningún filtro de intención NFC coincidente, Android no sabe que su actividad admite NFC y, en consecuencia, no pasa la etiqueta (y sus mensajes NDEF) a su actividad.

Con el fin de recibir el identificador NDEF mensajes / etiqueta en su actividad, por lo tanto, tendría que actualizar el filtro de intención para que coincida con el registro externo. Si el nombre del paquete de la aplicación es "com.example", el filtro de intenciones necesitaría tener el siguiente aspecto:

 [IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered }, Categories = new[] { Intent.CategoryDefault }, DataScheme = "vnd.android.nfc", DataPathPrefix = "/com.example:letypetype", DataHost = "ext")] 

Tenga en cuenta que el campo de dominio y una barra diagonal principal deben incluirse en el atributo DataPathPrefix.

Observe también que (aunque normalmente funciona), un nombre de paquete Java / Android no es un nombre de dominio válido según la especificación del tipo externo de NFC Forum. En su lugar, debe utilizar un nombre de dominio real (por ejemplo, "example.com").

Y por último: no olvide solicitar el permiso NFC en el manifiesto:

 <uses-permission android:name="android.permission.NFC" /> 
  • Cómo probar todo en Xamarin
  • Vinculación de fragmentos en listview
  • Cargando url con pdf en monodroid webview
  • Xamarin Android Player - No se puede reproducir este vídeo
  • Xamarin Android Cómo grabar vídeo en segundo plano y enviarlo al servidor mediante FTP
  • Error de implementación de Visual Studio 2015 Xamarin sin ningún mensaje de error
  • App Crash instantáneamente sin excepción o registro (parece como xamarin / mono error)
  • Random System.ArgumentException: 'jobject' no debe ser IntPtr.Zero
  • Cómo iniciar sesión en la tienda de componentes Xamarin usando Visual Studio 2013
  • ViewPager con FragmentPagerAdapter no se muestra
  • Xamarin Forms PCL HttpClient lanzando una excepción no controlada en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.