2012-09-27 89 views
5

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 funcionaba 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)."Nueva etiqueta recopilada" en lugar de leer las etiquetas de la aplicación - NFC android

¿Qué debo 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); 

} 

Respuesta

-2

que estaba viendo "Nueva etiqueta de recogida" de acumulación en aplicación llamada "etiquetas" porque mi aplicación no funcionaba correctamente.

Cuando funciona bien, tiene una prioridad más alta que "Etiquetas" y las etiquetas de lectura del 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.

+5

Bueno, ¿cómo hiciste que funcione correctamente? –

+0

Si aún tiene problemas, consulte mi respuesta. – MagicSeth

+3

Realmente no hay datos útiles en esta respuesta. Simplemente diciendo "oh, corregí mi aplicación y ahora funciona" no le dice a la comunidad nada sobre "cómo" se corrigió la aplicación y qué estaba haciendo incorrectamente. – jwir3

5

Vaya a Configuración -> Aplicaciones -> -> Todas las etiquetas (en mi caso) -> desactivar

+0

Esta no es la solución. Debe filtrar las etiquetas adecuadas en sus listas tecnológicas, o usar adapter.enableForegroundDispatch (this, pendingIntent, null, null); como se muestra en una buena respuesta a continuación cuando la aplicación está en primer plano – John

3

tuve un problema similar cuando se trata de abrir la aplicación de 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 la intención de NFC (TECH_DISCOVERED en mi caso) tenía mayor prioridad que un filtro de intención genérico basado en el esquema. Debido a que la aplicación de etiquetas registró TECH_DISCOVERED, se abrió en lugar de la mía.

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

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

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

Pero me di cuenta que tenía que anular el onNewIntent función, con el código de la siguiente manera:

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!

3

Puede escuchar todos etiquetas activarse utilizando la intención ACTION_TAG_DISCOVERED, en lugar de filtrado para 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); 
} 

Desde el NFCAdapter Documentation:

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.

Cuestiones relacionadas