son samsung recopilada que programar nueva etiquetas etiqueta escaneada compatible java android tags nfc nexus-s

java - samsung - nueva etiqueta recopilada huawei



"Nueva etiqueta recopilada" en lugar de leer las etiquetas de la aplicaciĆ³n-NFC android (4)

Estaba viendo "Nueva etiqueta recopilada" desde la aplicación incorporada llamada "Etiquetas" porque mi aplicación no funcionaba correctamente.

Cuando funciona bien, tiene una prioridad más alta que "Etiquetas" y etiquetas de lectura de teléfono de mi aplicación. Pero cuando funciona de manera incorrecta y el teléfono recolecta una etiqueta, la aplicación "Etiquetas" se activa y la aplicación "Etiquetas" se comunica con mi dispositivo.

Después de reparar el código, mi aplicación tiene una prioridad más alta y etiquetas de lectura de teléfono usando mi aplicación.

Tengo una clase, que crea conexión con NFC y dos actividades. Ambos crean un objeto de esa clase para que puedan conectarse a NFC. Anteriormente funcionó de alguna manera, pero ahora tengo un problema: mi aplicación no hace nada en NewIntent, ni siquiera en la primera actividad. En lugar de eso, puedo ver "Nueva etiqueta recopilada" de la aplicación incorporada llamada "Etiquetas" (Nexus S).

¿Que debería hacer?

clase:

public NFCForegroundUtil(Activity activity) { super(); this.activity = activity; mAdapter = NfcAdapter.getDefaultAdapter(activity .getApplicationContext()); mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent( activity, activity.getClass()) .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); IntentFilter ndef2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); IntentFilter ndef3 = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); try { ndef2.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } mFilters = new IntentFilter[] {ndef, ndef2, ndef3 }; mTechLists = new String[][] { new String[] { // android.nfc.tech.NfcV.class.getName(), android.nfc.tech.NfcA.class.getName(), android.nfc.tech.IsoDep.class.getName() } }; mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); }

Actividad 1:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nfcForegroundUtil = new NFCForegroundUtil(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Intent i = new Intent(this, NfcDisplayLabelActivity2.class); startActivity(i); }


Ir a configuración -> Aplicaciones -> Todas -> Etiquetas (en mi caso) -> deshabilitar


Puede escuchar todas las etiquetas activadas con el intento ACTION_TAG_DISCOVERED , en lugar de filtrar por una específica con el siguiente código:

public NFCForegroundUtil(Activity activity) { super(); this.activity = activity; mAdapter = NfcAdapter.getDefaultAdapter(activity .getApplicationContext()); mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent( activity, activity.getClass()) .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); // See below mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); }

De la documentación NFCAdapter :

Si pasa null para los parámetros filtros y techLists que actúa como comodín y hará que la actividad en primer plano reciba todas las etiquetas mediante el intento ACTION_TAG_DISCOVERED.


Tuve un problema similar al intentar abrir mi aplicación desde una etiqueta NFC. Había registrado un filtro de intenciones en mi AndroidManifest.xml para el esquema "magicnfc" y, sin embargo, abrió la aplicación Android OS Tags en vez de la mía.

Descubrí que el intento de NFC (TECH_DISCOVERED en mi caso) tenía mayor prioridad que un filtro de intención basado en un esquema genérico. Debido a que la aplicación de etiquetas registró TECH_DISCOVERED, se abrió en lugar de la mía.

Afortunadamente, las aplicaciones pueden registrarse para NDEF_DISCOVERED (un filtro de mayor prioridad) y se abren en lugar de la aplicación Etiquetas.

Eso hizo que mi aplicación se abriera cuando toqué la etiqueta.

Más información aquí: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

Pero descubrí que tenía que anular la función onNewIntent, con un código como este:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { String uri = intent.getDataString(); Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } }

Para mí, todo lo que necesitaba era:

String uri = intent.getDataString();

¡Buena suerte!