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.
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? –
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. –