代码实现过程如下:
读写NFC标签的纯文本数据.java
import java.nio.charset.Charset;
import java.util.Locale; import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView; /**
* 主 Activity
* 读写NFC标签的纯文本数据
* @author dr
*
*/
public class ReadWriteTextMainActivity extends Activity {
private TextView mInputText;
private String mText; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_write_text_main); mInputText = (TextView) findViewById(R.id.textview_input_text);
} protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == 1) {
mText = data.getStringExtra("text");
mInputText.setText(mText);
}
} public void onNewIntent(Intent intent) {
// read nfc text
if (mText == null) {
// 显示NFC标签内容
Intent myIntent = new Intent(this, ShowNFCTagContentActivity.class);
myIntent.putExtras(intent);
myIntent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
startActivity(myIntent); } else { // write nfc text
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefMessage ndefMessage = new NdefMessage(
new NdefRecord[] { createTextRecord(mText) });
writeTag(ndefMessage, tag);
}
} /**
* 将纯文本转换成NdefRecord对象。
* @param text
* @return
*/
public NdefRecord createTextRecord(String text) {
// 得到生成语言编码字节数组
byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
Charset.forName("US-ASCII"));
Charset utfEncoding = Charset.forName("UTF-8");
byte[] textBytes = text.getBytes(utfEncoding);
int utfBit = 0;
// 状态字节
char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length];
data[0] = (byte) status;
// 数组拷贝
System.arraycopy(langBytes, 0, data, 1, langBytes.length);
System.arraycopy(textBytes, 0, data, 1 + langBytes.length,
textBytes.length); NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[0], data);
return ndefRecord;
} boolean writeTag(NdefMessage ndefMessage, Tag tag) {
try {
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(ndefMessage);
return true;
} catch (Exception e) {
// TODO: handle exception
}
return false;
} // 向NFC标签写入文本
public void onClick_InputText(View view) {
Intent intent = new Intent(this, InputTextActivity.class);
startActivityForResult(intent, 1);
} }
读写NFC标签的纯文本数据.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick_InputText"
android:text="输入要写入文本" /> <TextView
android:id="@+id/textview_input_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp" /> <TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="请将NFC标签靠近手机背面读取或写入文本"
android:textColor="#F00"
android:textSize="16sp" /> <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/read_nfc_tag" /> </LinearLayout>
显示NFC标签内容.java
import cn.eoe.read.write.text.library.TextRecord;
import android.app.Activity;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView; /**
* 显示NFC标签内容
* @author dr
*
*/
public class ShowNFCTagContentActivity extends Activity { private TextView mTagContent;
private Tag mDetectedTag; // 传递过来的NFC的一个TAG对象
private String mTagText; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_nfctag_content);
mTagContent = (TextView) findViewById(R.id.textview_tag_content); mDetectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); Ndef ndef = Ndef.get(mDetectedTag); mTagText = ndef.getType() + "\nmax size:" + ndef.getMaxSize()
+ "bytes\n\n"; readNFCTag(); mTagContent.setText(mTagText);
} /**
*
*/
private void readNFCTag() {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msgs[] = null;
int contentSize = 0;
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
contentSize += msgs[i].toByteArray().length;
}
}
try {
if (msgs != null) {
NdefRecord record = msgs[0].getRecords()[0];
TextRecord textRecord = TextRecord.parse(record);
mTagText += textRecord.getText() + "\n\ntext\n"
+ contentSize + " bytes";
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
显示NFC标签内容.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/textview_tag_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp" android:layout_margin="6dp" /> </LinearLayout>
向NFC标签写入文本.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; /**
* 向NFC标签写入文本
*
* @author dr
*
*/
public class InputTextActivity extends Activity { private EditText mTextTag; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_text);
mTextTag = (EditText) findViewById(R.id.edittext_text_tag);
} public void onClick_OK(View view) {
Intent intent = new Intent();
intent.putExtra("text", mTextTag.getText().toString());
setResult(1, intent);
finish(); }
}
向NFC标签写入文本.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="请输入要写入的文本" android:textSize="16sp" /> <EditText
android:layout_marginTop="10dp"
android:id="@+id/edittext_text_tag"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick_OK"
android:text="确定" /> </LinearLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.eoe.read.write.text"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.NFC" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ReadWriteTextMainActivity"
android:label="读写NFC标签的纯文本数据"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".ShowNFCTagContentActivity"
android:label="显示NFC标签内容"
android:launchMode="singleTask" /> <activity
android:name=".InputTextActivity"
android:label="向NFC标签写入文本" /> </application> </manifest>
DEMO:下载地址:http://download.csdn.net/detail/androidsj/7678947