package com.oreilly.demo.android.pa.sensordemo; import java.nio.charset.Charset; import android.app.Activity; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; import android.nfc.NfcEvent; import android.os.Bundle; import android.os.Parcelable; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class NFC40 extends Activity { private static final boolean AARUSE = false; private CreateNdefMessageCallback nfccallback = new CreateNdefMessageCallback() { @Override public NdefMessage createNdefMessage(NfcEvent event) { return createNDFMsg(false); } }; private NdefMessage createNDFMsg(boolean now) { String text = "Beam "+(now ? "NOW" : "ON")+" com.oreilly.demo.android.pa.sensordemo Beam with" + (AARUSE ? "" : "out") + " AAR Use"; byte[] mimeBytes = "application/com.oreilly.demo.android.pa.sensordemo".getBytes(Charset.forName("US-ASCII")); NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], text.getBytes()); NdefMessage msg = new NdefMessage(new NdefRecord[] {mimeRecord}); NdefMessage msgWaAAR = new NdefMessage(new NdefRecord[] {mimeRecord, NdefRecord.createApplicationRecord("com.oreilly.demo.android.pa.sensordemo")}); return AARUSE ? msgWaAAR : msg; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nfc40); setTitle("Near Field Communication - 4.0"); } @Override public void onResume() { super.onResume(); setupView(); } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } private void doBeamOn() { NfcAdapter nfcadapter = NfcAdapter.getDefaultAdapter(this); if(nfcadapter != null) { nfcadapter.setNdefPushMessageCallback(nfccallback, this); } } private void doBeamNow() { NfcAdapter nfcadapter = NfcAdapter.getDefaultAdapter(this); if(nfcadapter != null) { nfcadapter.setNdefPushMessage(createNDFMsg(true), this); } } private void setupView() { findViewById(R.id.close).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); try { if(getIntent() != null && getIntent().getAction() != null && (getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED))) { findViewById(R.id.beamon).setVisibility(View.GONE); findViewById(R.id.beamnow).setVisibility(View.GONE); findViewById(R.id.tagdata).setVisibility(View.VISIBLE); analyzeIntent(getIntent()); } else if(NfcAdapter.getDefaultAdapter(this) == null || !NfcAdapter.getDefaultAdapter(this).isEnabled()) { findViewById(R.id.beamon).setVisibility(View.GONE); findViewById(R.id.beamnow).setVisibility(View.GONE); ((TextView) findViewById(R.id.tagdata)).setText("NFC not enabled!"); } else { findViewById(R.id.tagdata).setVisibility(View.GONE); findViewById(R.id.beamon).setVisibility(View.VISIBLE); findViewById(R.id.beamon).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doBeamOn(); } }); findViewById(R.id.beamnow).setVisibility(View.VISIBLE); findViewById(R.id.beamnow).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doBeamNow(); } }); } } catch (Exception t) { findViewById(R.id.tagdata).setVisibility(View.VISIBLE); ((TextView) findViewById(R.id.tagdata)).setText("ERROR: "+t.toString()); t.printStackTrace(); } } private void analyzeIntent(final Intent intent) { if(intent == null) return; findViewById(R.id.tagdata).setVisibility(View.VISIBLE); Parcelable[] msgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); ((TextView) findViewById(R.id.tagdata)).setText(new String(((NdefMessage) msgs[0]).getRecords()[0].getPayload())); } }