The above footage from our NFC Workshop walks Android developers through code which demonstrates how to read content and parse messages from an NFC tag.
You can follow along below or download the source here.
(Note: It may be beneficial to first read the previous post on writing content to an NFC tag which prefaces material in this post.)
We start by setting up an intent filter and grabbing our default adapter.
We create a pending intent and apply the 'FLAG_ACTIVITY_SINGLE_TOP' method to ensure that we don't create multiple instances of the same application.
The intent filter is going to look a little different than it did when we were writing to a tag. Here, we add the scheme (http), the data authority (www.smartwhere.com), and the path (.*).
We create a pending intent and apply the 'FLAG_ACTIVITY_SINGLE_TOP' method to ensure that we don't create multiple instances of the same application.
The intent filter is going to look a little different than it did when we were writing to a tag. Here, we add the scheme (http), the data authority (www.smartwhere.com), and the path (.*).
We're being explicit about what we want to receive, giving us higher priority in the dispatch model.
public class MainActivity extends Activity {
private static final String TAG = "NFCReadTag";
private NfcAdapter mNfcAdapter;
private IntentFilter[] mNdefExchangeFilters;
private PendingIntent mNfcPendingIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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 smartwhere = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
smartwhere.addDataScheme("http");
smartwhere.addDataAuthority("www.smartwhere.com", null);
smartwhere.addDataPath(".*", PatternMatcher.PATTERN_SIMPLE_GLOB);
mNdefExchangeFilters = new IntentFilter[] { smartwhere };
}
At onResume() we check to see if the NFC adapter is enabled and we execute enableForegroundDispatch(), passing in our pending intent and filters.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected void onResume() {
super.onResume();
if(mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent,
mNdefExchangeFilters, null);
if (!mNfcAdapter.isEnabled()){
LayoutInflater inflater = getLayoutInflater();
View dialoglayout = inflater.inflate(R.layout.nfc_settings_layout,(ViewGroup) findViewById(R.id.nfc_settings_layout));
new AlertDialog.Builder(this).setView(dialoglayout)
.setPositiveButton("Update 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) {
finish(); // exit application if user cancels
}
}).create().show();
}
} else {
Toast.makeText(getApplicationContext(), "Sorry, No NFC Adapter found.", Toast.LENGTH_SHORT).show();
}
}
At 'onPause()' we execute disableForegroundDispatch().
'onNewIntent()' is where we get the intent once we've tapped the tag. Then we can use 'getParceableExtra()' to get the tag data and build an NDEF message array.
In this example, we are just looking for the first message and the first record, grabbing its payload, and displaying it.
@Override
protected void onPause() {
super.onPause();
if(mNfcAdapter != null) mNfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] messages = null;
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
messages = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
messages[i] = (NdefMessage) rawMsgs[i];
}
}
if(messages[0] != null) {
String result="";
byte[] payload = messages[0].getRecords()[0].getPayload();
// this assumes that we get back am SOH followed by host/code
for (int b = 1; b<payload.length; b++) { // skip SOH
result += (char) payload[b];
}
Toast.makeText(getApplicationContext(), "Tag Contains " + result, Toast.LENGTH_SHORT).show();
}
}
}
}
Video: NFC Workshop, July 17, 2012
Location: Seattle Waterfront
Post by: Kelsey W
Can you please post the source for the layout also?
ReplyDeleteAs this code was constructed for a demo, there isn't much of a layout. However, you can go to the following path to see all of the source: http://www.tapwise.com/svn/nfcreadtag/trunk/
DeleteThanks a lot
Deleteit's can't read tag?
Deletebecause?
What is SOH?
Deletehelp me? please
ReplyDelete