NFC 的功能和他是做什么用的我就不多废话了,请自行百度。
并且你要在你的AndroidManifest.xml中开通NFC权限。
//开通权限
// 设置在应用商店上过滤掉没有nfc功能的设备
//设置最小sdk支持版本为10
来确定,那个应用区处理这个标签信息。
如果你需要做这样一个应用,那么你的AndroidManifest.xml文件中,就必须给
你想要的组件的多添加Intent-filter 并添加指定的Action name
系统给的ACTION name有三个 他们分别是。
ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。
ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便你的tag中所包含的数据是NDEF的,但是如果这个数据的MIME type或URI不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.
ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的TAG类型的
有了这样三个Action name 就可以保证在你设备连接nfc标签时,你的应用
有权利去连接这个标签并进行读写。
官方的图解:
在代码中,比如在一个Activity的intent拦截器中加入如下代码
1:过滤ACTION_NDEF_DISCOVERED:
2:过滤ACTION_TUCH_DISCOVERED:
//一般我们会以这个拦截器为基准,来拦截不同种类的标签
//这个data 标识拦截的类型 ,这里标示无格式文本类型,这个数据定义的越准确。
// 你拦截的效果才越准确
3:过滤ACTION_TAG_DISCOVERED:
//这个一般用不到,可以忽略
接下来我们来介绍,如何以ACTION_TUCH_DISCOVERED为基准来设置拦截机器。
在介绍之前,你需要先了解,NFC标签是由不同标准的。
下面是标准列表
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClassic
android.nfc.tech.MifareUltralight
你使用的标签设备是支持哪些标准的,一定要在 tech-List中穿件一个他的集合 或者他集合的子集。
哦、对,对于这个拦截文件你需要重新创建一个xml资源文件。
下面是一个我项目完整的拦截文件,这个文件只能
android.nfc.tech.NfcA
android.nfc.tech.Ndef
android.nfc.tech.NfcA
android.nfc.tech.Ndef
AndroidManifest.xml
//引入拦截配置文件
private void writeNdefTag(Intent in){
Tag tag = in.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
try {
//这一句别丢了,读nfc标签的时候不需要这句,因为那时数据直接就在intent中。
ndef.connect();
//构造一个合适的NdefMessage。你可以看到代码里用了NdefRecord数组,只不过这个数组里只有一个record
NdefMessage ndefMsg = new NdefMessage(new NdefRecord[]{createRecord()});
ndef.writeNdefMessage(ndefMsg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private NdefRecord createRecord(){
// return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI,
// "http://www.baidu.com".getBytes(Charset.forName("US-ASCII")),
// new byte[0], new byte[0]);
return new NdefRecord(
NdefRecord.TNF_MIME_MEDIA ,
"application/com.android.TestNfc".getBytes(Charset.forName("US-ASCII")),
new byte[0], "com.android.yufeimusic".getBytes(Charset.forName("US-ASCII")));
}
/**
* An example of how to use the NFC foreground dispatch APIs. This will intercept any MIME data
* based NDEF dispatch as well as all dispatched for NfcF tags.
*/
public class ForegroundDispatch extends Activity {
private NfcAdapter mAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;
private TextView mText;
private int mCount = 0;
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.foreground_dispatch);
mText = (TextView) findViewById(R.id.text);
mText.setText("Scan a tag");
mAdapter = NfcAdapter.getDefaultAdapter(this);
// Create a generic PendingIntent that will be deliver to this activity. The NFC stack
// will fill in the intent with the details of the discovered tag before delivering to
// this activity.
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Setup an intent filter for all MIME based dispatches
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
mFilters = new IntentFilter[] {
ndef,
};
// Setup a tech list for all NfcF tags
mTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}
@Override
public void onResume() {
super.onResume();
if (mAdapter != null) mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
mTechLists);
}
@Override
public void onNewIntent(Intent intent) {
Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
}
@Override
public void onPause() {
super.onPause();
if (mAdapter != null) mAdapter.disableForegroundDispatch(this);
}
}