對於Android 4.0 SDK中提供的Beam例子,對於NFC開發來說的確是一個不錯的模板。對於了解NFC的NDEF消息處理過程不妨看下面的代碼。
- public class Beam extends Activity implements CreateNdefMessageCallback,
- OnNdefPushCompleteCallback {
- NfcAdapter mNfcAdapter;
- TextView mInfoText;
- private static final int MESSAGE_SENT = 1;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- mInfoText = (TextView) findViewById(R.id.textView);
-
- mNfcAdapter = NfcAdapter.getDefaultAdapter(this); //實例化NFC設備
- if (mNfcAdapter == null) {
- mInfoText = (TextView) findViewById(R.id.textView);
- mInfoText.setText("NFC is not available on this device.");
- }
-
- mNfcAdapter.setNdefPushMessageCallback(this, this); //注冊NDEF回調消息
- mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
- }
-
-
- @Override
- public NdefMessage createNdefMessage(NfcEvent event) {
- Time time = new Time();
- time.setToNow();
- String text = ("Beam me up!\n\n" +
- "Beam Time: " + time.format("%H:%M:%S"));
- NdefMessage msg = new NdefMessage(
- new NdefRecord[] { createMimeRecord(
- "application/com.example.android.beam", text.getBytes())
- });
- return msg;
- }
-
- @Override
- public void onNdefPushComplete(NfcEvent arg0) {
- // A handler is needed to send messages to the activity when this
- // callback occurs, because it happens from a binder thread
- mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
- }
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_SENT:
- Toast.makeText(getApplicationContext(), "Message sent!", Toast.LENGTH_LONG).show();
- break;
- }
- }
- };
-
- @Override
- public void onResume() {
- super.onResume();
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
- processIntent(getIntent());
- }
- }
-
- @Override
- public void onNewIntent(Intent intent) {
- // onResume gets called after this to handle the intent
- setIntent(intent);
- }
-
- /**
- * Parses the NDEF Message from the intent and prints to the TextView
- */
- void processIntent(Intent intent) {
- Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
- NfcAdapter.EXTRA_NDEF_MESSAGES);
- // only one message sent during the beam
- NdefMessage msg = (NdefMessage) rawMsgs[0];
- // record 0 contains the MIME type, record 1 is the AAR, if present
- mInfoText.setText(new String(msg.getRecords()[0].getPayload()));
- }
-
- /**
- * Creates a custom MIME type encapsulated in an NDEF record
- *
- * @param mimeType
- */
- public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
- byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
- NdefRecord mimeRecord = new NdefRecord(
- NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
- return mimeRecord;
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // If NFC is not available, we won't be needing this menu
- if (mNfcAdapter == null) {
- return super.onCreateOptionsMenu(menu);
- }
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.options, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_settings:
- Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
- startActivity(intent);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- }