6.NFC之非NDEF格式

先看流程图

使用步骤:

第一步:声明权限

<!-- 允许应用程序使用NFC功能 -->
<uses-permission android:name="android.permission.NFC" />

第二步:Activity设置能拦截的NFC tag,不需要拦截ACTION_NDEF_DISCOVERED类型的NDEF标签,标题说了拦截非NDEF的tag     

        <activity
            android:name="com.example.nfcdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!-- 能拦截TECH_DISCOVERED的tag -->
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
            </intent-filter>
            <!-- TECH_DISCOVERED中哪些部分的tag,在xml文件中找 -->
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
            <!-- 能拦截ACTION_TAG_DISCOVERED,好像拦截了,也没啥用,又处理不了-->
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

其中,nfc_tech_filter.xml在res的xml文件夹中(没有该文件夹则创建该文件夹)

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>
    <!-- 以下只是显示怎么添加多个nfc支持类 -->
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>

</resources>
View Code

 第三步:在拦截的Aty中

private NfcAdapter nfcAdapter; // NFC适配器
// 获取默认的NFC控制器,并进行判断
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
Log.d("h_bl", "设备不支持NFC!");
finish();
return;
}
if (!nfcAdapter.isEnabled()) {
Toast.makeText(getApplicationContext(), "请在系统设置中先启用NFC功能!", Toast.LENGTH_SHORT).show();
Log.d("h_bl", "请在系统设置中先启用NFC功能!");
return;
}
Intent intent = this.getIntent(); // 捕获NFC Intent
praseIntent(intent);

解析Intent

    private void praseIntent(Intent intent) {

        String nfcAction = intent.getAction(); // 解析该Intent的Action
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(nfcAction)) {
            Log.d("h_bl", "ACTION_TECH_DISCOVERED");
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // 获取Tag标签,既可以处理相关信息
            for (String tech : tag.getTechList()) {
                Log.d("h_bl", "该tag支持的tech=" + tech);
            }
            IsoDep isoDep = IsoDep.get(tag);
            String str = "";
            try {
                isoDep.connect(); // 连接
                if (isoDep.isConnected()) {
                    Log.d("h_bl", "isoDep.isConnected"); // 判断是否连接上
                    // 1.首先初始化的时候你要先读根目录3F00
                    byte[] ROOT_DIRECTORY={
                            (byte)0x00,
                            (byte)0xA4,
                            (byte)0x00,
                            (byte)0x00,
                            (byte)0x02,
                            (byte)0x3F,
                            (byte)0x00,
                            (byte)0x00
                    };
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (isoDep != null) {
                    try {
                        isoDep.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

解析过程:

1.解析该Intent的Action

2.获取Tag标签,既可以处理相关信息

3.创建相关的类进行处理

4.详见IsoDep类的使用

还有一个前台调度系统,详见前台调度系统的使用。

原文地址:https://www.cnblogs.com/H-BolinBlog/p/5481751.html