Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Múltiples escaneos / intenciones entregadas a la actividad de recepción

Tengo un problema en curso donde mi aplicación está entregando varias intenciones a la actividad de la recepción después de una exploración de la etiqueta de NFC.

Mi aplicación esencialmente escanea una etiqueta NFC que tiene algunos datos sobre ella y la envía al servidor. En general, funciona bien. Entiendo que NFC funciona dentro de un umbral de unos pocos cms y tal vez mi problema es el error del usuario, por ejemplo, el usuario está agitando el teléfono alrededor de la etiqueta que podría escanear dos veces dentro de milisegundos.

He puesto un temporizador en el objeto de aplicación. Cuando el usuario escanea una etiqueta, comienzo el temporizador y establezca un indicador en false, este indicador se comprueba dentro de la Actividad que maneja la intención de NFC y la intención se elimina si el indicador es falso. Esto (debe) detener múltiples escaneos de una etiqueta dentro de 10 segundos.

Mi aplicación se utiliza para el trabajo de HomeCare, por lo que el usuario escaneará una etiqueta en la casa de clientes. Cuando analizan la etiqueta la primera vez que los registra en ese cliente con datos y una marca de tiempo. La segunda exploración de la etiqueta los desconectará.

En general, funciona, pero a veces un cuidador entrará y saldrá en el primer cliente, luego en el segundo cliente o algunas veces horas más tarde, el cuidador será registrado de nuevo en el cliente anterior.

Lo que creo que está sucediendo es el cuidador es mis-exploración de la etiqueta que está provocando el adpter NFC dos veces. La primera intención se entrega de inmediato, luego la segunda se entrega minutos / horas más tarde.

Cómo fluyen las cosas. Etiqueta de exploración -> intención entregada a Actividad -> iniciar temporizador AppObj. Escribir datos en sqlite DB -> iniciar un IntentService para enviar la transacción al servidor (cancelado después de 10 segundos).

¿Puede alguien ver un problema que he perdido que podría explicar por qué un intento de duplicado se entrega horas más tarde?

¿Alguien puede sugerir una solución que detendría esto?

¿Existe un problema con la forma en que se trata la intención en la actividad? Por ejemplo, el código incorrecto en el método de ciclo de vida de actividad incorrecto?

¿Hay una manera de cancelar / interceptar la segunda intención de la segunda exploración errónea?

Básicamente, lo que quiero es que el nfcAdapter podría ser activado 10 veces en un segundo, pero sólo la primera exploración se entrega a la actividad. ¿Cómo puedo conseguir esto?

Voy a publicar algún código.

[Editar2]

Toast.makeText(this, "about to test flags", Toast.LENGTH_LONG).show(); if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { Toast.makeText(this, "intent is from history", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "intent is not from history", Toast.LENGTH_LONG).show(); } 

.

[Edit3]

 <activity android:name=".NfcscannerActivity" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="com.carefreegroup.rr3.QRCODE_ACTION" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity> <activity android:name=".EntryActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:launchMode="singleTask" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="com.carefreegroup.rr3.INVALID_CARER_TAG_SCANNED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

. [Edit4]

 Tag tagTest = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); Ndef ndefTag = Ndef.get(tagTest); try { Log.e(TAG, "about to test io operations on Ndef Tag"); ndefTag.connect(); // this should already perform an IO operation and should therefore fail if there is no tag NdefMessage ndefMsg = ndefTag.getNdefMessage(); // this reads the current NDEF message from the tag and consequently causes an IO operation Log.e(TAG, "tested io operations on Ndef Tag, must be a real Tag!!!!!******!!!!!!"); } catch (Exception e) { // there is no tag or communication with tag dropped Log.e(TAG, "tested io operations on Ndef Tag, No Tag there, must be a re-delivery of the old Tag via an intent!!!!!******!!!!!!!!!!!!!!!!!!!!!!"); onResume(); } finally { try { ndefTag.close(); } catch (Exception e) { } } 

  • Enviar URL desde Android a Windows Phone a través de NFC da enlace a Play Store
  • Tarjeta Emulate Mifare con Android 4.4
  • ¿Cómo saber si la etiqueta está presente?
  • ¿Qué tan bien soporta la API NFC de Android Mifare Desfire?
  • Cómo cambiar "Elegir una acción" a "Completar acción usando" en Android?
  • Detección de NFC en dispositivos Android
  • Tutorial NFC para Android que no sea API demo
  • ¿Cómo funcionan los pagos NFC?
  • 2 Solutions collect form web for “Múltiples escaneos / intenciones entregadas a la actividad de recepción”

    De lo que usted describe, yo asumiría que sus usuarios afectados "cierran" ( ocultan realmente) la aplicación presionando la llave casera. Más tarde, están abriendo la aplicación (o mejor dicho, la actividad) de la historia (tecla de inicio de larga duración).

    Suponiendo que sólo procesa los intentos relacionados con NFC en onCreate() , normalmente no se ejecutaría en el problema que describió al iniciar su actividad del historial, ya que el método onCreate() no se llamaría si su actividad aún existiera en segundo plano . Pero si tu actividad ha sido destruida mientras tanto (por ejemplo, la aplicación ha sido eliminada manualmente, la aplicación ha sido eliminada por el sistema para liberar recursos, etc.), volver a iniciar la aplicación desde el historial hará que tu método onCreate() se ejecute de nuevo. A medida que Android reconstruye la pila de actividades y vuelve a enviar las intenciones originales (es decir, la intención que inicialmente lanzó su actividad) al abrir aplicaciones del historial, su actividad recibirá la intención NFC que había recibido cuando se inició inicialmente.

    Puede superar este problema comprobando si la intención que recibe tiene el conjunto FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY . Esto sería el caso sólo si su actividad se inició a partir de la historia.

     if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { ... } } 

    No resolviendo su problema inicial pero como último recurso, recuerde que las etiquetas NFC pueden ser accedidas por operaciones de E / S después de recibir una intención. Así que para comprobar si la etiqueta que recibe en la intención realmente existe, podría realizar una operación de IO.

    Si, por ejemplo, su etiqueta es una etiqueta NDEF:

     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); Ndef ndefTag = Ndef.get(tag); try { ndefTag.connect(); // this should already perform an IO operation and should therefore fail if there is no tag NdefMessage ndefMsg = ndefTag.getNdefMessage(); // this reads the current NDEF message from the tag and consequently causes an IO operation } catch (Exception e) { // there is no tag or communication with tag dropped } finally { try { ndefTag.close(); } catch (Exception e) { } } 

    Para las etiquetas que no sean NDEF, necesitará saber cómo acceder a la etiqueta utilizando comandos de bajo nivel. Pero al menos la prueba de conexión funcionaría para cualquier etiqueta.

    Múltiples escaneos / intentos entregados a la actividad de recepción

    Ya se aceptan respuestas, pero las mejores opciones son

    Agrega el siguiente indicador al iniciar la actividad (por defecto la actividad se inicia en modo predeterminado, es decir, inicia la nueva instancia de actividad) FLAG_ACTIVITY_CLEAR_TOP

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.