赞
踩
牛逼1:通信的一方可以通过磁场供电。无源
牛逼2:靠的近,不用搜、不用手工连接、不用输入密码。
所有通信:就是连接,发与收,断开。就像Linux万物皆文件。
我就简单协议分类:
1.标准NDEF(主要)。
2.非标准NDEF:系统目前支持的Tag TECH:表1和表2。
表 1. 支持的标签技术
类 | 说明 |
---|---|
TagTechnology | 这是所有标签技术类都必须实现的接口。 |
NfcA | 提供对 NFC-A (ISO 14443-3A) 属性和 I/O 操作的访问权限。 |
NfcB | 提供对 NFC-B (ISO 14443-3B) 属性和 I/O 操作的访问权限。 |
NfcF | 提供对 NFC-F (JIS 6319-4) 属性和 I/O 操作的访问权限。 |
NfcV | 提供对 NFC-V (ISO 15693) 属性和 I/O 操作的访问权限。 |
IsoDep | 提供对 ISO-DEP (ISO 14443-4) 属性和 I/O 操作的访问权限。 |
Ndef | 提供对 NDEF 格式的 NFC 标签上的 NDEF 数据和操作的访问权限。 |
NdefFormatable | 为可设置为 NDEF 格式的标签提供格式化操作。 |
表 2. 可选择支持的标签技术
类 | 说明 |
---|---|
MifareClassic | 提供对 MIFARE Classic 属性和 I/O 操作的访问权限(如果此 Android 设备支持 MIFARE)。 |
MifareUltralight | 提供对 MIFARE Ultralight 属性和 I/O 操作的访问权限(如果此 Android 设备支持 MIFARE)。 |
1、在onCreate()中
a.设置PendingIntent为FLAG_ACTIVITY_SINGLE_TOP,即 栈顶复用(当被启动的Activity处于Task栈顶时,可以复用,直接调用onNewIntent方法)。
b. 过滤需要的Intent,如果不匹配,前台调度系统将退回到intent调度系统。(我在manifests.xml已经加了标签调度系统)
2、activity lose时即onPause() 里关闭前台调度;acitivity focus时即onResume() 里开启前台调度。
3、还需要onNewIntent 里处理从NFC扫描的标签中读出的数据。
1.获取NFC权限/添加Intent过滤器
2.获取NFC适配器
3.捕获NFC Intent。intent.getAction()可判断是否是NDEF?具体看下面源码
是NDEF处理:不懂就一步步调试解析,intent对象里包含了所有刷卡信息。
非NDEF处理:
4.处理该Intent(获取信息Tag)
5.判断标签类型,并执行相关操作,核心函数: get(Tag tag)得到对象 ,connect()连接,transceive(byte[] data)发送接收,close()断开。
- private NfcAdapter nfcAdapter;
- private PendingIntent pendingIntent;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.nfcard);
-
- nfcAdapter = NfcAdapter.getDefaultAdapter(this);
- pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
- onNewIntent(getIntent());
- }
- @Override
- protected void onPause() {
- super.onPause();
- if (nfcAdapter != null)
- nfcAdapter.disableForegroundDispatch(this);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- if (nfcAdapter != null)
- nfcAdapter.enableForegroundDispatch(this, pendingIntent,CardManager.FILTERS, CardManager.TECHLISTS);
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- Log.d("NFCTAG", intent.getAction()); //刷卡的信息都在intent里
- try {
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
- Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
- if (rawMessages != null) {
- NdefMessage[] messages = new NdefMessage[rawMessages.length];
- for (int i = 0; i < rawMessages.length; i++) {
- messages[i] = (NdefMessage) rawMessages[i];
- }
- // Process the messages array.
- //...
- }
- } else {
- final Parcelable rawMessage = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- if (rawMessage != null) {
- final Tag tag = (Tag) rawMessage; //ID and Supported tag technologies is here
- Log.d("NFCTAG", tag.toString());
- final IsoDep isodep = IsoDep.get(tag); //就可以根据支持的类型来收发数据了
- if (isodep != null) {
- isodep.connect(); //连接
- byte[] send_hex=new byte[]{0x00, (byte) 0xA4,0x04,0x00,0x0E,0x32}; //发的命令得卡支持才有响应,我这删几个字节
- byte[] recv_buffer = isodep.transceive(send_hex); //发送与接收
- String recv = "";
- for (int i = 0; i < recv_buffer.length; i++)
- recv += String.format("%02X ", recv_buffer[i]);
- Log.d("NFCTAG", "(" + recv_buffer.length + ")" + recv);
- isodep.close(); //关闭
- }
- }
- }
- } catch (Exception e) {
- Log.d("NFCTAG", "error " + e);
- }
- }
以下是manifests.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.sinpo.xnfc" android:versionCode="1" android:versionName="1.1.111223">
-
- <uses-permission android:name="android.permission.NFC" />
- <uses-feature android:name="android.hardware.nfc"
- android:required="true" />
- <application android:icon="@drawable/ic_app_main" android:label="@string/app_name">
- <activity android:name="NFCard" android:label="@string/app_name"
- android:configChanges="keyboardHidden|orientation"
- android:screenOrientation="portrait" android:launchMode="singleTask"
- android:windowSoftInputMode="adjustUnspecified|stateAlwaysHidden"
- android:windowBackground="@null">
- <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.TECH_DISCOVERED" />
- </intent-filter>
- <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
- android:resource="@xml/nfc_tech_filter" />
- <intent-filter>
- <action android:name="android.nfc.action.TAG_DISCOVERED" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- </application>
-
- </manifest>
卡发送与响应OK
简单吧。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。