Hi I am developing an app for reading and writing data to NFC Tag. I am having problem in reading data from NFC Tag. When I try to read data my application crashes for first time and again when I scan the Tag for the second time the app reads the data.
Please help me out on this issue. Here is my code.
Thanks in advance.
public class Read extends Activity {
Tag detectedTag;
TextView txtType,txtSize,txtWrite,txtRead;
NfcAdapter nfcAdapter;
IntentFilter[] readTagFilters;
PendingIntent pendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.read);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
nfcAdapter = NfcAdapter.getDefaultAdapter();
detectedTag =getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
txtType = (TextView) findViewById(R.id.txtType);
txtSize = (TextView) findViewById(R.id.txtsize);
txtWrite = (TextView) findViewById(R.id.txtwrite);
txtRead = (TextView) findViewById(R.id.txt_read);
pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
new Intent(this,getClass()).
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
readTagFilters = new IntentFilter[]{tagDetected,filter2};
}
protected void onNewIntent(Intent intent) {
if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){
detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
readFromTag(getIntent());
}
}
@Override
protected void onResume() {
super.onResume();
nfcAdapter.enableForegroundDispatch(this, pendingIntent, readTagFilters, null);
}
public void readFromTag(Intent intent){
Ndef ndef = Ndef.get(detectedTag);
try{
ndef.connect();
txtType.setText(ndef.getType().toString());
txtSize.setText(String.valueOf(ndef.getMaxSize()));
txtWrite.setText(ndef.isWritable() ? "True" : "False");
Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages != null) {
NdefMessage[] ndefMessages = new NdefMessage[messages.length];
for (int i = 0; i < messages.length; i++) {
ndefMessages[i] = (NdefMessage) messages[i];
}
NdefRecord record = ndefMessages[0].getRecords()[0];
byte[] payload = record.getPayload();
String text = new String(payload);
txtRead.setText(text);
ndef.close();
}
}
catch (Exception e) {
Toast.makeText(getApplicationContext(), "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
}
}
}
The only line missing in onNewIntent() Method was
setIntent(intent);
I added it and the code is running fine.