Is it possible to read then write and then again read back the same data earlier we wrote on a NFC tag without removing it from the field(mobile) in Android? If Anybody has done this then please share over here….
public class MainActivity extends Activity
{
NfcAdapter adapter;
PendingIntent pendingIntent;
IntentFilter writeTagFilters[];
Tag mytag;
private TextView mTextViewData;
Context ctx;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ctx=this;
mTextViewData = (TextView)findViewById(R.id.mtextView);
Button btnWrite = (Button) findViewById(R.id.write_button);
final EditText mEditText = (EditText)findViewById(R.id.edit_message);
adapter = NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter tagDetected1 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try
{
tagDetected1.addDataType("text/nfc-service-tag");
}
catch (MalformedMimeTypeException e)
{
throw new RuntimeException("Could not add MIME type.", e);
}
writeTagFilters = new IntentFilter[] { tagDetected1 };
btnWrite.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(mytag==null)
{
Toast.makeText(ctx, ctx.getString(R.string.error_detected), Toast.LENGTH_LONG ).show();
}
else
{
writeTag(mEditText.getText().toString(),mytag);
}
}
});
}
private void writeTag(String text,Tag tag)
{
// record to launch Play Store if app is not installed
// record that contains our custom "retro console" game data, using custom MIME_TYPE
String mimeType = "text/nfc-service-tag";
byte[] payload = text.getBytes(Charset.forName("US-ASCII"));
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
NdefMessage message = new NdefMessage(new NdefRecord[] { record });
try
{
// see if tag is already NDEF formatted
Ndef ndef = Ndef.get(tag);
if (ndef != null)
{
ndef.connect();
if (!ndef.isWritable())
{
Toast.makeText(ctx, "Read-only tag.", Toast.LENGTH_LONG ).show();
}
// work out how much space we need for the data
int size = message.toByteArray().length;
if (ndef.getMaxSize() < size)
{
Toast.makeText(ctx, "Tag doesn't have enough free space.", Toast.LENGTH_LONG).show();
}
ndef.writeNdefMessage(message);
Toast.makeText(ctx, ctx.getString(R.string.ok_writing), Toast.LENGTH_LONG ).show();
ndef.close();
}
else
{
// attempt to format tag
NdefFormatable format = NdefFormatable.get(tag);
if (format != null)
{
try
{
format.connect();
format.format(message);
Toast.makeText(ctx, ctx.getString(R.string.ok_writing), Toast.LENGTH_LONG ).show();
}
catch (IOException e)
{
Toast.makeText(ctx,"Unable to format tag to NDEF.", Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(ctx,"Tag doesn't appear to support NDEF format.", Toast.LENGTH_LONG).show();
}
}
}
catch(Exception e)
{
}
}
@Override
protected void onNewIntent(Intent intent)
{
String action = intent.getAction();
if (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
{
NdefMessage[] msgs = getNdefMessagesFromIntent(intent);
final NdefMessage msg = (NdefMessage)msgs[0];
String payload = new String(msg.getRecords()[0].getPayload());
mTextViewData.setText(payload);
mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Toast.makeText(this, "In onNewIntent()", Toast.LENGTH_LONG ).show();
}
else if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED))
{
Toast.makeText(this, "This NFC tag has no NDEF data.", Toast.LENGTH_LONG).show();
}
}
@Override
public void onResume()
{
super.onResume();
if (getIntent().getAction() != null)
{
// tag received when app is not running and not in the foreground:
if (getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
{
NdefMessage[] msgs = getNdefMessagesFromIntent(getIntent());
NdefRecord record = msgs[0].getRecords()[0];
byte[] payload = record.getPayload();
String payloadString = new String(payload);
mTextViewData.setText(payloadString);
Toast.makeText(this, "In onResume()", Toast.LENGTH_LONG ).show();
}
}
adapter.enableForegroundDispatch(this, pendingIntent, writeTagFilters, null);
}
@Override
public void onPause()
{
super.onPause();
adapter.disableForegroundDispatch(this);
}
NdefMessage[] getNdefMessagesFromIntent(Intent intent)
{
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
{
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null){
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++)
{
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
else
{
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
msgs = new NdefMessage[] { msg };
}
}
else
{
//Log.e(TAG, "Unknown intent.");
finish();
}
return msgs;
}
}
You can call
ndef.getNdefMessage()right after you dondef.writeNdefMessage(message)to check the result. It will actually read the NDEF message back from the tag. However, in general, whenndef.writeNdefMessage(message)does not throw an exception, it is safe to assume the message was written successfully.