2016-04-04 8 views
0

Meine aktuelle Android-Anwendung erkennt jedes NFC-Tag und führt die erforderliche Funktion aus. Ich möchte jedoch nur mit einem bestimmten Tag mit einer bestimmten UID arbeiten. Was ist der beste Weg, dies zu erreichen?Anwendung, die nur für ein bestimmtes NFC-Tag funktioniert

Die UID für den Tag in Frage: 046a0b42402b84

Mein Code für die Funktion NFC ist unten:

public class NFC extends AppCompatActivity { 

    NfcAdapter nfcAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_nfc); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     String username = getIntent().getStringExtra("Username"); 

     TextView tv = (TextView) findViewById(R.id.TVusername); 
     tv.setText(username); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 


     }); 

     nfcAdapter = NfcAdapter.getDefaultAdapter(this); 

     if(nfcAdapter!=null && nfcAdapter.isEnabled()) { 

     }else{ 
      finish(); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 

     Toast.makeText(this, "NFC intent received!", Toast.LENGTH_LONG).show(); 

     super.onNewIntent(intent); 
    } 

     @Override 
     protected void onResume() { 

     Intent intent = new Intent(this, AttendanceRegistration.class); 
     intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
     IntentFilter[] intentFilter = new IntentFilter[]{}; 

     nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilter, null); 

     super.onResume(); 
    } 


    @Override 
    protected void onPause() { 

     nfcAdapter.disableForegroundDispatch(this); 

     super.onPause(); 
    } 

     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Antwort

0

Android nicht NFC-Tag Erkennung Benachrichtigungen ermöglichen, indem für bestimmte Tags registriert werden, um ihre UID/Antikollisionskennung/Seriennummer. Wenn Sie möchten, dass Ihre App nur mit einem bestimmten NFC-Tag gestartet wird (durch die Registrierung eines Intent-Filters in ANdroidManifest.xml), müssen Sie eine NDEF-Nachricht speichern (mit einem benutzerdefinierten NNDEF-Datensatz, für den Sie filtern können, und Android-Anwendung) Record) auf dem Tag

anzeigen Wenn Sie nicht möchten, dass Ihre Anwendung von dem Tag ins Leben gerufen werden und will nur das Etikett erkennen, während der Aktivität im Vordergrund steht (der Code bereits versucht dies durch die Registrierung für das Dispatch-System im Vordergrund zu tun, können Sie Benachrichtigungen für alle gefundenen Tags erhalten und die Tags einfach anhand ihrer UID filtern.

Zuerst müssen Sie richtig für das Vordergrundversandsystem registrieren Benachrichtigungen für jeden Tag zu erhalten (beachten Sie, dass Sie nicht in den Vordergrund Versand mit einem PendingIntent für eine andere Aktivität registrieren!):

@Override 
protected void onResume() { 
    super.onResume(); 

    Intent intent = new Intent(this, getClass()); 
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 
} 

Sie können dann erhalten die Entdeckung NFC Absichten in onNewIntent und filtern sie basierend auf dem Tag UID:

@Override 
protected void onNewIntent(Intent intent) { 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) || 
     NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) || 
     NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { 
     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

     byte[] uid = tag.getId(); 
     byte[] referenceUid = new byte[]{ (byte)0x04, (byte)0x6a, (byte)0x0b, (byte)0x42, (byte)0x40, (byte)0x2b, (byte)0x84 }; 

     if (Arrays.equals(referenceUid, uid)) { 
      // do something 
     } 
    } 
} 
+0

das ist genau das, was ich wollte, Problem gelöst. Danke –

+0

Entschuldigung, noch neu dazu. –

+0

@Micheal Roland Wie würde man dies für 2 Empfänger neu erstellen, habe ich versucht versuchen und fangen und wenn und sonst Statements? –