2012-09-27 59 views
5

Ho una classe, che crea connessione a NFC e due attività. Entrambi creano un oggetto di quella classe in modo che possano connettersi a NFC. In precedenza funzionava in qualche modo ma ora ho un problema - la mia applicazione non fa nulla su NewIntent, anche sulla prima attività. Invece, posso vedere "Nuovo tag raccolto" dall'app integrata chiamata "Tag" (Nexus S)."Nuovo tag raccolto" invece di leggere i tag dell'applicazione - Android NFC

Cosa devo fare?

classe:

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); 

} 

attività 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); 

} 

risposta

-2

stavo vedendo "Nuovo tag raccolti" dalla app chiamato "Tag", perché la mia domanda non funzionava correttamente build-in.

Quando funziona, ha priorità più alta di "Tag" e il telefono legge i tag dalla mia applicazione. Ma quando funziona in modo non corretto e il telefono raccoglie un tag, l'applicazione "Tag" viene attivata e l'applicazione "Tag" parla al mio dispositivo.

Dopo aver riparato il codice, la mia app ha priorità più alta e il telefono legge i tag utilizzando la mia applicazione.

+5

Bene, come hai fatto a farlo funzionare correttamente? –

+0

Se hai ancora problemi, dai un'occhiata alla mia risposta. – MagicSeth

+3

Non ci sono davvero dati utili in questa risposta. Semplicemente affermare "oh, ho corretto la mia app e ora funziona" non dice alla community nulla su _how_ l'app è stata corretta e _quello_ che stavi inizialmente facendo in modo errato. – jwir3

5

Vai in Impostazioni -> Applicazioni -> Tutti -> Etichette (nel mio caso) -> disabilitare

+0

Questa non è la soluzione. Dovrebbe filtrare i tag appropriati nei suoi elenchi tecnici, o usare adapter.enableForegroundDispatch (this, pendingIntent, null, null); come mostrato in una buona risposta qui sotto quando l'app è in primo piano – John

3

Ho avuto un problema simile quando si tenta di aprire la mia app da un tag NFC. Avevo registrato un intentfilter nel mio AndroidManifest.xml per lo schema "magicnfc" eppure apriva l'app per Android OS Tags invece del mio.

Ho scoperto che l'intento NFC (TECH_DISCOVERED nel mio caso) aveva una priorità più alta di un filtro di intenti generico basato su schema. Poiché l'app Tag ha registrato TECH_DISCOVERED, si apriva invece del mio.

Fortunatamente, le app possono essere registrate per NDEF_DISCOVERED (un filtro con priorità più alta) e vengono aperte anziché l'app Tag.

Ciò ha reso la mia app aperta quando ho toccato il tag.

Maggiori informazioni è qui: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

Ma ho scoperto che avevo per ignorare la funzione onNewIntent, con codice come questo:

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]; 
     } 
    } 
} 

Per me, tutto quello che serviva era:

String uri = intent.getDataString(); 

Buona fortuna!

3

È possibile ascoltare per tutti tag attivati ​​utilizzando il ACTION_TAG_DISCOVERED intento, piuttosto che il filtraggio per una specifica con il seguente codice:

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); 
} 

Dal NFCAdapter Documentation:

Se si passa null per entrambi i parametri filter e techLists che agisce come wild card e farà in modo che l'attività in primo piano riceva tutti i tag tramite l'intento ACTION_TAG_DISCOVERED.

Problemi correlati