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.
- Acceso denegado (0x80004005) en Process.Start () en la aplicación android
- Xamarin falla aplicación Android en el modo de liberación (Parse.Android SDK)
- Acceso al AssetManager en formularios Xamarin
- ¿Cómo funciona Xamarin iOS y Android?
- No se puede obtener SyncAdapter para trabajar en Xamarin
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é.
- Archivado tamaño de archivo APK muy grande - Xamarin.Android
- No se puede crear una nueva aplicación en blanco (Android) en Visual Studio 2015
- Xamarin Forms Android Keyboard mueve toda la página hacia arriba
- Xamarin-Android Mvvmcross - Tocar en la aplicación de inicio de notificación recibida con salpicaduras o llevar al frente
- El enlace MvvmCross Fragment no funciona
- Recargar datos en la pestaña seleccionada en un fragmento utilizando el paginador de vistas
- ¿Hay posibilidad de asignar un valor a Android Button en Xamarin?
- Salida de depuración extraña en la aplicación desde la actualización a Visual Studio 2017 15.3.0
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" />
- Cordova Android Upgrade – No se puede encontrar el módulo 'lodash / object / assign' Error
- android build tool añade el calificador v4 a las carpetas dibujables por defecto en el apk generado