android NFC开发实例

13年前
对于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);          }      }  }