Android API Guides---Advanced NFC

来源:互联网 发布:淘宝买真货退假货犯法 编辑:程序博客网 时间:2024/04/24 14:44

Advanced NFC

本文件描述了高级的NFC主题,如与各种标签技术工作,写入NFC标签,以及前景调度,它允许在前景的应用程序,以处理意图甚至当其他应用滤波器的相同。


与支持的标签技术方面的工作


当与NFC标签和Android供电设备的工作,主要格式用来在标签上读取和写入数据是NDEF。当设备扫描与NDEF数据的标签,Android提供的解析消息并尽可能在NdefMessage提供对它的支持。有这样的情况,然而,当在扫描不包含NDEF数据或当NDEF数据不能被映射到一个MIME类型或URI的标记。在这些情况下,您需要直接与标签打开通讯和读写它用自己的协议(在原始字节)。 Android提供了这些用例与android.nfc.tech包,这在表1中可以使用getTechList()方法来确定由标签支持的技术,并与类之一来创建相应的TagTechnology对象的通用支持通过android.nfc.tech提供


表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提供访问的NFC标签已被格式化为NDEF NDEF数据和操作。
NdefFormatable提供的标签,可能是NDEF formattable一个格式化操作。
不需要以下标记technlogies通过Android设备的支持。


表2.可选支持标签技术
类说明
MifareClassic提供对MIFARE经典性能和I / O操作,如果Android设备支持MIFARE。
MifareUltralight提供对MIFARE超轻性能和I / O操作,如果Android设备支持MIFARE。
与标签技术和ACTION_TECH_DISCOVERED合作意向


当设备会扫描上有NDEF的数据,但不能被映射到一个MIME或者URI的标签,标签调度系统尝试与ACTION_TECH_DISCOVERED意图开始一项活动。当与非NDEF数据的标记被扫描时也使用了ACTION_TECH_DISCOVERED。有了这个回退,您可以用直接当标签调度系统无法分析它给你的标签中的数据。与标签技术时的基本步骤如下:


筛选的ACTION_TECH_DISCOVERED意图指定要处理的标签技术。请参阅过滤对NFC意图获取更多信息。在一般情况下,该标记调度系统试图启动ACTION_TECH_DISCOVERED意图时NDEF消息不能被映射到一个MIME类型或URI,或者如果该标记扫描不包含NDEF数据。有关该是如何确定的更多信息,请参见该标签调度系统。
当你的应用程序收到的意图,获得来自意图Tag对象:

Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
获取TagTechnology的实例,通过调用在android.nfc.tech包中的类获取工厂方法之一。你可以通过调用一个get工厂方法之前调用getTechList()枚举变量的支持的技术。例如,从标签获得MifareUltralight的实例,请执行以下操作:

MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
读取和写入标签


读取和写入NFC标签包括获得来自与标签的意图和开放沟通的标签。你必须定义自己的协议栈,读取和写入数据的标记。请记住,但是,你仍然可以读取并直接与标记工作时写NDEF数据。你想怎么构造的东西它是由你。下面的示例演示如何使用MIFARE超轻标签工作。

package com.example.android.nfc;import android.nfc.Tag;import android.nfc.tech.MifareUltralight;import android.util.Log;import java.io.IOException;import java.nio.charset.Charset;public class MifareUltralightTagTester {    private static final String TAG = MifareUltralightTagTester.class.getSimpleName();    public void writeTag(Tag tag, String tagText) {        MifareUltralight ultralight = MifareUltralight.get(tag);        try {            ultralight.connect();            ultralight.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));            ultralight.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));            ultralight.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));            ultralight.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));        } catch (IOException e) {            Log.e(TAG, "IOException while closing MifareUltralight...", e);        } finally {            try {                ultralight.close();            } catch (IOException e) {                Log.e(TAG, "IOException while closing MifareUltralight...", e);            }        }    }    public String readTag(Tag tag) {        MifareUltralight mifare = MifareUltralight.get(tag);        try {            mifare.connect();            byte[] payload = mifare.readPages(4);            return new String(payload, Charset.forName("US-ASCII"));        } catch (IOException e) {            Log.e(TAG, "IOException while writing MifareUltralight            message...", e);        } finally {            if (mifare != null) {               try {                   mifare.close();               }               catch (IOException e) {                   Log.e(TAG, "Error closing tag...", e);               }            }        }        return null;    }}
使用前景调度系统


前景调度系统允许一个活动在处理相同意图的其他活动截获的意图和主张优先权。利用这个系统包括构建一些数据结构Android系统要能适当意图发送到您的应用程序。要启用前景调度系统:


添加以下代码在活动的onCreate()方法:
创建的PendingIntent对象,因此Android系统可以在被扫描时与标签的细节来填充它。

PendingIntent pendingIntent = PendingIntent.getActivity(    this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
声明意图过滤器来处理你想拦截的意图。前台调度系统会检查指定的意图过滤器使用时,设备扫描标签所接收的意图。如果匹配,那么你的应用程序处理的意图。如果它不匹配,则前景调度系统回落到意图调度系统。指定意图过滤器和过滤器技术的空数组,指定要筛选为后备的TECH_DISCOVERED打算所有标签。下面的代码片段处理所有MIME类型NDEF_DISCOVERED。您应该只处理你需要的人。

IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);    try {        ndef.addDataType("*/*");    /* Handles all MIME based dispatches.                                       You should specify only the ones that you need. */    }    catch (MalformedMimeTypeException e) {        throw new RuntimeException("fail", e);    }   intentFiltersArray = new IntentFilter[] {ndef, };
设置您的应用程序要处理标签技术的数组。调用Object.class.getName()方法来获得类要支持该技术。

techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
覆盖下面的活动生命周期回调,当失去活性(的onPause()),并重新获得(onResume()),重点添加逻辑来启用和禁用前景调度。 enableForegroundDispatch()必须从主线程调用,只有当活动是在前台(在onResume调用()保证这一点)。您还需要实现onNewIntent回调处理来自扫描NFC标签中的数据。

public void onPause() {    super.onPause();    mAdapter.disableForegroundDispatch(this);}public void onResume() {    super.onResume();    mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);}public void onNewIntent(Intent intent) {    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);    //do something with tagFromIntent}
请参阅从API演示的前景调度样本的完整样本。

0 0
原创粉丝点击