1

I’m doing this application that should read some nfc tags.

It is a kind of treasure hunt and who scans all the tags wins.

I structured the application so that there is an initial login and a set of data is saved in a database so that you can keep track of the players who scanned the tags.

I followed a tutorial to create an activity that can read tags. (Only one line of text should be read from the tags)

This is the code I put in the manifest

<uses-permission android:name="android.permission.NFC"/>

<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain"/>
</intent-filter>

This is the activity code

public class scanActivity extends AppCompatActivity {

private TextView scanView;
private PendingIntent pendingIntent;
private IntentFilter[] readfilters;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan);

    scanView=findViewById(R.id.scanView);
    try {
        Intent intent= new Intent(this,getClass());
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

        IntentFilter intentFilter = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        IntentFilter textFilter = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED,"text/plain");
        readfilters = new IntentFilter[] {intentFilter, textFilter};
    } catch (IntentFilter.MalformedMimeTypeException e) {
        e.printStackTrace();
    }


    readTag(getIntent());
}
private void enableRead(){
    NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this,pendingIntent,readfilters,null);
}

private void disableRead(){
    NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}

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

@Override
protected void onPause() {
    super.onPause();
    disableRead();
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    readTag(getIntent());
}

private void readTag(Intent intent) {
    Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    scanView.setText("");
    if(messages != null){
        for (Parcelable message:messages){
            NdefMessage ndefMessage = (NdefMessage) message;
            for (NdefRecord record : ndefMessage.getRecords()){
                switch (record.getTnf()){
                    case NdefRecord.TNF_WELL_KNOWN:
                        scanView.append("WELL KNOWN ");
                        if (Arrays.equals(record.getType(),NdefRecord.RTD_TEXT)){
                            scanView.append("TEXT: ");
                            scanView.append(new String(record.getPayload()));
                            scanView.append("\n");
                        }
                }
            }
        }
    }
}
}

Currently when I approach a tag, the phone tries to open a task, but it ends up reopening the application and it does not even open the task with the textview on which the content of the tag should be written.

I would need to make sure that the application does not reopen again when I approach a tag, but simply switch to the next activity, keeping the previous ones.

Also, I would like to prevent the app from opening itself when approaching a tag.

If the above requests are impossible. I need at least to be able to create an activity that reads the tags without opening other activities.

I thank in advance for those who tried to help me <3.

1 Answers1

1

To prevent the App from being automatically opened automatically when approaching the Tag then remove the intent-filter entries in your manifest

If you don't want the Activity paused and resumed when a Tag is detected then don't use the older NFC API of enableForegroundDispatch use the newer and better API of enabledReaderMode as this will deliver the Tag data to a new Thread in your current activity without pausing and resuming your current activity.

Java example of enableReaderMode

Andrew
  • 8,198
  • 2
  • 15
  • 35