zoukankan      html  css  js  c++  java
  • tag标签[置顶] 高级NFC

    最近朋友几篇文章分析了改tag标签的文章. 关联文章的地址

        文章译自:Advanced NFC 

        本文档分析了高级NFC,如与各种标签技术协作,NFC标签写入和前台调度,它答应应用程序在前台处置的intent,即使当其他应用程序过滤器雷同的。

        

    标签技术支持任务

        当NFC标签和Android任务时,使用读取和写入数据的的主要格式是NDEF标签。当设备扫描标签NDEF数据,Android供给了解析NdefMessage消息和其他可能的支持。当扫描标签不包含NDEF数据或NDEF数据不能被映射到一个MIME类型或UR时,在这些情况下,你需要打开tag并直接与其信息交换和使用自己的协议读写数据(在原始字节)。Android为使用的android.nfc.tech包情况供给了通用的支持,android.nfc.tech包如表1中所描述的 。您可以使用的getTechList()方法来确定标签的技术支持,并建立 与之一由android.nfc.tech类响应TagTechnology对象。

        Table 1. Supported tag technologies

        

    Class Description
    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的数据和操纵的拜访。
    NdefFormatable 供给可能被格式化为NDEF的 formattable的标签。

        

    上面的tag技术其实不强制android设备支持(即选择性的支持)。

        

    Table 2. Optional supported tag technologies

        

    Class Description
    MifareClassic 如果此Android设备支持MIFARE,供给拜访的MIFARE Classic性能和I / O操纵。
    MifareUltralight 如果此Android设备支持MIFARE,供给拜访的MIFARE 超轻性能和I / O操纵。

        

    Tag技术与ACTION_TECH_DISCOVERED intent间协作

        当设备扫描含有NDEF数据的tag,但不能被映射到一个MIME或URI,标签调度系统试图启动一个携带ACTION_TECH_DISCOVERED intent的activity。 扫描tag不是NDEF数据格式时,ACTION_TECH_DISCOVERED也可使用。有这种东西,如果标签调度系统无法解析tag时,可以直接与tag上数据停止交互。tag技术任务时的基本步调如下:
    1、过滤指定要处置的标签技术的ACTION_TECH_DISCOVERED intent。在一般情况下,标签调度系统实验启动一个ACTION_TECH_DISCOVERED的intent,当NDEF消息,不能被映射为MIME类型或URI,或者如果标签扫描不包含NDEF数据。如何确定欲了解更多信息,请参阅标签调度系统。
    2、当你的应用程序接收的intent,取得标签对象:

    Tag

         tagFromIntent

        =

         intent

        .

        getParcelableExtra

        (

        NfcAdapter

        .

        EXTRA_TAG

        );

        3、获得实例的TagTechnology,通过调用android.nfc.tech包 的get方法。调用get方法前,通过调用getTechList()可以罗列tag支持的技术。例如,从tag中要获得一个实例MifareUltralight,可以如下做:

    MifareUltralight

        .

        get

        (

        intent

        .

        getParcelableExtra

        (

        NfcAdapter

        .

        EXTRA_TAG

        ));

        

    Tags读写

        NFC标签读写必须确保获得intent并打开tag间通信。为了读取和写入数据到标签,您必须定义自己的协议栈。请记住,当直接与tag交互时,你仍然可以读取写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

        ;

            

        }

        

        }

        

    前台调度系统的使用

        

    前台调度系统答应activity截取intent并声明自己比其他处置雷同intent的activity的优先级要高。使用这个系统可认为android系统构建一些数据结构,数据结构能够为应用程序发送适当的意图。为了使前景调度系统:

        

    1、在activity的onCreate()方法中添加如下code:

        

        

     a、创建一个PendingIntent对象,android系统可以填充在tag被扫描到的内容。
    PendingIntent pendingIntent =PendingIntent.getActivity(
     this,0,newIntent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
    b、声明intent过滤器来处置你想拦截的intent。前台调度系统检查过滤指定的intent,这个intent是扫描标签时收到的。如果匹配,那么你的应用程序处置的意图。如果它不匹配,前台调度系统回到intent调度系统的。指定一个空的数组intent过滤器和技术过滤器,指定要过滤全部的标签,回到TAG_DISCOVERED  intent。上面的代码片段处置全部MIME类型NDEF_DISCOVERED。您应该只处置那些你需要的。
    IntentFilter ndef =newIntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try{
            ndef.addDataType("*/*");/* Handles all MIME based dispatches.
                                 You should specify only the ones that you need. */
        }
        catch(MalformedMimeTypeException e){
            thrownewRuntimeException("fail", e);
        }
       intentFiltersArray =newIntentFilter[]{ndef,};
    c、设置您的应用程序要处置tag技术的数组。调用 Object.class.getName()方法来获得支持的所以技术。
    techListsArray =newString[][]{newString[]{NfcF.class.getName()}};

        


        

    2、重写以下activity生命周期回调函数,当activity失去(onPause())和恢复(onResume())焦点时,添加逻辑启用和禁用前台调度。enableForegroundDispatch()必须主线程调用,并只有当activity在前台(调用onResume()保障这一点)。您还需要实现onNewIntent回调函数来处置扫描NFC标签的数据。
    publicvoid onPause(){
        super.onPause();
        mAdapter.disableForegroundDispatch(this);}publicvoid onResume(){
        super.onResume();
    mAdapter.enableForegroundDispatch(this,pendingIntent,intentFiltersArray,techListsArray);}publicvoid onNewIntent(Intent intent){
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        //do something with tagFromIntent}
    完全的例子可以查看API demo中的ForegroundDispatch部分。

    文章结束给大家分享下程序员的一些笑话语录: 大家喝的是啤酒,这时你入座了。
    你给自己倒了杯可乐,这叫低配置。
    你给自已倒了杯啤酒,这叫标准配置。
    你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
    你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
    你的同事给你倒了杯白酒,这叫推荐配置。
    菜过三巡,你就不跟他们客气了。
    你向对面的人敬酒,这叫p2p。
    你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp。
    你向一桌人挨个敬酒,这叫令牌环。
    你说只要是兄弟就干了这杯,这叫广播。
    有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
    你的小弟们过来敬你酒,这叫一对多。
    你是boss,所有人过来敬你酒,这叫服务器。
    酒是一样的,可是喝酒的人是不同的。
    你越喝脸越红,这叫频繁分配释放资源。
    你越喝脸越白,这叫资源不释放。
    你已经醉了,却说我还能喝,叫做资源额度不足。
    你明明能喝,却说我已经醉了,叫做资源保留。
    喝酒喝到最后的结果都一样
    你突然跑向厕所,这叫捕获异常。
    你在厕所吐了,反而觉得状态不错,这叫清空内存。
    你在台面上吐了,觉得很惭愧,这叫程序异常。
    你在boss面前吐了,觉得很害怕,这叫系统崩溃。
    你吐到了boss身上,只能索性晕倒了,这叫硬件休克。

    --------------------------------- 原创文章 By
    tag和标签
    ---------------------------------

  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3105145.html
Copyright © 2011-2022 走看看