2013-10-28 9 views
5

Ich arbeite an einer Anwendung, wo ich die Daten in NFC-Tag gespeichert werden müssen, durch Daten, ich meine, ist einfache ganzzahlige Werte als solche 0,1,2,3 und so. Die Funktionen zum Lesen der Daten von NFC funktionieren gut, wenn sie in der Aktivitätsklasse sind, aber ich muss die Anwendung im Hintergrund ausführen, damit auch wenn die Anwendung nicht im Vordergrund läuft, ich die Daten von der NFC lesen kann. Also habe ich eine Serviceklasse geschrieben und die Funktion von der Aktivität in die Serviceklasse verschoben. Aber es hat nicht funktioniert.

Android: Lesen von NFC-Tag in der Serviceklasse

Dies ist die "MainActivity.java"

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

Startservice (new Intent (this, MyService.class));
Diese Zeile startet die Serviceklasse.

Die Service-Klasse ist "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"); 
    } 

} 

dies in der onCreate() Funktion einwandfrei funktioniert. Das Problem ist, diese Zeile:

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

Das erste Argument der Funktion übernimmt den Kontext einer Aktivität und das ist, wo ich bin stecken. Gibt es eine Möglichkeit, diese oder jede Alternative zu lösen. Danke für Ihre Hilfe.

Antwort

3

Die NFC-Funktionen von Android (speziell Intents für Tags, Beam usw.) sind nur für Aktivitäten im Vordergrund verfügbar.

+0

Vielen Dank für Ihre Antwort aber können Sie vorschlagen, wie der Standard Android NFC liest das Tag im Hintergrund läuft und versucht, die Daten mit dem Browser zu öffnen? –

+0

Die NFC-Tag-Erkennung wird vom NFC-Systemdienst ausgeführt. Der Systemdienst meldet dann ** Aktivitäten ** basierend auf Absichten. Der Webbrowser hat genau wie andere Aktivitäten, die NFC-Ereignisse empfangen möchten, Intent-Filter, die für diese Absichten registriert sind. –