NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司 和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、 消费类电子产品、PC 和智能控件工具间进行近距离无线通信。NFC 提供了一种 简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。
android从4.0 以后便支持ntf。以下是一个android ntf例子,跑这个例子需 要设备自带nfc,然后在设置中打开nfc。程序跑起来后点击,读取卡信息, 然后将公交啊,放入屏幕上,然后就可以看到log中打印出来的卡的信息; `
public class MainActivity extends Activity {
private static final String TAG = "stickynotes";
private boolean mWriteMode = false;
NfcAdapter mNfcAdapter;
EditText mNote;
EditText mNoteRead;
PendingIntent mNfcPendingIntent;
IntentFilter[] mWriteTagFilters;
IntentFilter[] mNdefExchangeFilters;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mNote = ((EditText) findViewById(R.id.note));
mNote.addTextChangedListener(mTextWatcher);
mNoteRead = ((EditText) findViewById(R.id.noteRead));
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);//得到设备适
配
if (mNfcAdapter==null) {
toast("设备不支持nfc!");
return;
}
findViewById(R.id.write_tag).setOnClickListener(mTagWriter);
findViewById(R.id.read_tag).setOnClickListener(mTagRead);
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter ndefDetected = new IntentFilter(
NfcAdapter.ACTION_NDEF_DISCOVERED);//读取的信息筛选
try {
ndefDetected.addDataType("text/plain");
} catch (MalformedMimeTypeException e) {
}
mNdefExchangeFilters = new IntentFilter[] { ndefDetected };
IntentFilter tagDetected = new IntentFilter(
NfcAdapter.ACTION_TAG_DISCOVERED);
mWriteTagFilters = new IntentFilter[] { tagDetected };
}
@Override
protected void onResume() {
super.onResume();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
NdefMessage[] messages = getNdefMessages(getIntent());
byte[] payload = messages[0].getRecords()[0].getPayload();
setNoteBody(new String(payload));
setIntent(new Intent()); // Consume this intent.
}
if (mNfcAdapter!=null) {
enableNdefExchangeMode();
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter!=null) {
mNfcAdapter.disableForegroundNdefPush(this);
}
}
@Override
protected void onNewIntent(Intent intent) {
// NDEF exchange mode
if (!mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = getNdefMessages(intent);
String body = new String(msgs[0].getRecords()[0].getPayload());
setNoteBody(body);
}
// Tag writing mode
if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeTag(getNoteAsNdef(), detectedTag);
}
}
private TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
};
private View.OnClickListener mTagWriter = new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// Write to a tag for as long as the dialog is shown.
disableNdefExchangeMode();
enableTagWriteMode();
new AlertDialog.Builder(MainActivity.this).setTitle("Touch tag to write")
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
disableTagWriteMode();
enableNdefExchangeMode();
}
}).create().show();
}
};
private View.OnClickListener mTagRead = new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// Write to a tag for as long as the dialog is shown.
disableTagWriteMode();
enableNdefExchangeMode();
new AlertDialog.Builder(MainActivity.this).setTitle("Touch tag to read")
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
disableTagWriteMode();
enableNdefExchangeMode();
}
}).create().show();
}
};
private void setNoteBody(String body) {
Editable text = mNoteRead.getText();
text.clear();
text.append(body);
}
private NdefMessage getNoteAsNdef() {
byte[] textBytes = mNote.getText().toString().getBytes();
NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(),
new byte[] {}, textBytes);
return new NdefMessage(new NdefRecord[] {
textRecord
});
}
NdefMessage[] getNdefMessages(Intent intent) {
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
|| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
} else {
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] {
record
});
msgs = new NdefMessage[] {
msg
};
}
} else {
Log.d(TAG, "Unknown intent.");
finish();
}
return msgs;
}
private void enableNdefExchangeMode() {
mNfcAdapter.enableForegroundNdefPush(MainActivity.this, getNoteAsNdef());
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mNdefExchangeFilters, null);
}
private void disableNdefExchangeMode() {
mNfcAdapter.disableForegroundNdefPush(this);
mNfcAdapter.disableForegroundDispatch(this);
}
private void enableTagWriteMode() {
mWriteMode = true;
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
mWriteTagFilters = new IntentFilter[] {
tagDetected
};
mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mWriteTagFilters, null);
}
private void disableTagWriteMode() {
mWriteMode = false;
mNfcAdapter.disableForegroundDispatch(this);
}
boolean writeTag(NdefMessage message, Tag tag) {
int size = message.toByteArray().length;
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
toast("Tag is read-only.");
return false;
}
if (ndef.getMaxSize() < size) {
toast("Tag capacity is " + ndef.getMaxSize() + " bytes, message is " + size
+ " bytes.");
return false;
}
ndef.writeNdefMessage(message);
toast("写入数据成功.");
return true;
} else {
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
toast("Formatted tag and wrote message");
return true;
} catch (IOException e) {
toast("Failed to format tag.");
return false;
}
} else {
toast("Tag doesn't support NDEF.");
return false;
}
}
} catch (Exception e) {
toast("写入数据失败");
}
return false;
}
private void toast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}}`
设备 未完待续