2013-10-28 16 views
5

Sto lavorando a un'applicazione in cui ho bisogno di leggere i dati memorizzati nel tag NFC, per dati intendo semplici valori interi come tali 0,1,2,3 e così via. Le funzioni per leggere i dati da NFC funzionano bene quando si trova nella classe Activity ma ho bisogno di eseguire l'applicazione in background, quindi anche quando l'applicazione non è in esecuzione in foreground posso leggere i dati dall'NFC. Così ho scritto una classe di servizio e spostato la funzione dall'attività alla classe di servizio. Ma non ha funzionato.

Android: lettura tag NFC nella classe di servizio

Questo è il "MainActivity.java"

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     startService(new Intent(this, MyService.class)); 
    } 

StartService (nuovo Intent (questo, MyService.class));
Questa riga avvia la classe di servizio.

classe Il servizio è "MyService.java"

public class MyService extends Service { 

    private NfcAdapter mNfcAdapter; 
    private PendingIntent mNfcPendingIntent; 
    private IntentFilter[] mReadTagFilters; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 
     mNfcPendingIntent = PendingIntent.getActivity(this, 0, new 
     Intent(this, 
     getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP 
     | Intent.FLAG_ACTIVITY_CLEAR_TOP), 0); 
     IntentFilter ndefDetected = new IntentFilter(
     NfcAdapter.ACTION_NDEF_DISCOVERED); 
     ndefDetected.addDataScheme("http"); 
     IntentFilter techDetected = new IntentFilter(
     NfcAdapter.ACTION_TECH_DISCOVERED);  
     mReadTagFilters = new IntentFilter[] { ndefDetected, techDetected };  
      Log.v("service", "return from onCreate function"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    @Deprecated 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 


     Log.v("service", "onStart function"); 
     if (mNfcAdapter != null) { 
      if (!mNfcAdapter.isEnabled()) { 
       new AlertDialog.Builder(this) 
         .setTitle("NFC Dialog") 
         .setMessage("Please switch on NFC") 
         .setPositiveButton("Settings", 
           new DialogInterface.OnClickListener() { 
            public void onClick(DialogInterface arg0, 
              int arg1) { 
             Intent setnfc = new Intent(
               Settings.ACTION_WIRELESS_SETTINGS); 
             startActivity(setnfc); 
            } 
           }) 
         .setOnCancelListener(
           new DialogInterface.OnCancelListener() { 
            public void onCancel(DialogInterface dialog) { 
             dialog.dismiss(); 
            } 
           }).create().show(); 
      } 
      mNfcAdapter.enableForegroundDispatch (MainActivity.mContext, mNfcPendingIntent, 
        mReadTagFilters, null); 
     } else { 
      Toast.makeText(this, 
        "Sorry, NFC adapter not available on your device.", 
        Toast.LENGTH_SHORT).show(); 
     } 
     Log.v("service", "return fonStart function"); 
    } 

} 

In questo la funzione onCreate() sta funzionando benissimo. Il problema è questa linea:

mNfcAdapter.enableForegroundDispatch (mContext, mNfcPendingIntent, 
        mReadTagFilters, null); 

Il primo argomento della funzione accetta contesto di un'attività e questo è dove mi sono bloccato. C'è un modo per risolvere questa o qualsiasi alternativa. Grazie per l'aiuto.

risposta

3

La funzionalità NFC di Android (in particolare la ricezione di Intenti per tag, Beam, ecc.) È disponibile solo per le attività in primo piano.

+0

Grazie per la risposta, ma puoi suggerire in che modo l'Android NFC predefinito legge il tag mentre è in esecuzione in background e tenta di aprire i dati con il browser? –

+0

Il rilevamento dei tag NFC viene gestito dal servizio di sistema NFC. Il servizio di sistema notifica quindi ** attività ** basate su intenti. Il browser web, proprio come altre attività che vogliono ricevere eventi NFC, ha filtri di intent registrati per tali intenti. –

Problemi correlati