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和标签
    ---------------------------------

  • 相关阅读:
    sftp 使用笔记
    python-day001获取mac地址
    tomcat 修改端口
    mysql 封装与使用
    redis 封装使用
    centos7安装jenkins
    securecrt设置编码、字体、编码
    linux操作系统上路由管理维护
    ElasticSearch操作和使用指南
    sqlyog连接mysql错误码2058
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3105145.html
Copyright © 2011-2022 走看看