Android近场通信---高级NFC(二)

读写NFC标签

读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信。要读写NFC标签数据,你必须要定义自己的协议栈。但是,要记住在直接使用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;
 
publicclassMifareUltralightTagTester{
 
    privatestaticfinalString TAG =MifareUltralightTagTester.class.getSimpleName();
 
    publicvoid 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);
            }
        }
    }
 
    publicString readTag(Tag tag){
        MifareUltralight mifare =MifareUltralight.get(tag);
        try{
            mifare.connect();
            byte[] payload = mifare.readPages(4);
            returnnewString(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);
               }
            }
        }
        returnnull;
    }
}
 
使用前台调度系统
前台调度系统允许一个Activity拦截Intent对象,并且声明该Activity的优先级要比其他的处理相同Intent对象的Activity高。使用这个系统涉及到为Android系统构建一些数据结构,以便能够把相应的Intent对象发送给你的应用程序,以下是启用前台调度系统的步骤:
1.  在你的Activity的onCreate()方法中添加下列代码:
     A.  创建一个PendingIntent对象,以便Android系统能够在扫描到NFC标签时,用它来封装NFC标签的详细信息。
          PendingIntent pendingIntent =PendingIntent.getActivity(
                 this,0,newIntent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
     B.  声明你想要截获处理的Intent对象的Intent过滤器。前台调度系统会在设备扫描到NFC标签时,用声明的Intent过滤器来检查接收到的Intent对象。如果匹配就会让你的应用程序来处理这个Intent对象,如果不匹配,前台调度系统会回退到Intent调度系统。如果Intent过滤器和技术过滤器的数组指定了null,那么就说明你要过滤所有的退回到TAG_DISCOVERED类型的Intent对象的标签。以下代码会用于处理所有的NDEF_DISCOVERED的MIME类型。只有在需要的时候才做这种处理:
 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.  建立一个应用程序希望处理的NFC标签技术的数组。调用Object.class.getName()方法来获取你想要支持的技术的类:

techListsArray = new String[][] { new String[] { 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

Android近场通信---高级NFC(二)相关推荐

  1. 九、Android近场通信(NFC)

    Android近场通信(NFC) 前言 项目目录 1.NFC (1)权限 (2)代码MainActivity.activity_main (3)NFC设备 2.AndroidManifest.xml ...

  2. Android近场通信---NFC基础(一)

    Android近场通信---NFC基础(一) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架API ...

  3. Android近场通信---NFC基础(三)

    Android近场通信---NFC基础(三) 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NF ...

  4. android 近场通信,Android NFC近场通信03----读写MifareClassic卡(示例代码)

    Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16 ...

  5. Android近场通信---NFC基础(一)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/t ...

  6. VIVOtech:使用近场通信(NFC)技术的免接触付款解决方案的市场领导者

    汇聚全球最新商业创意,激发创业灵感 由 鲁伟 发布于2012 年 6 月 25 日 行业:金融服务 随着 Google 钱包的发布,NFC 近场通信技术与移动支付的结合又一次成为媒体关注的焦点.一旦N ...

  7. Android近场通信

    一.三种近场通信技术 1.类别 (1)WIFI (2)BlueTooth (3)NFC 2.三大技术的特点 (1)WIFI ​ WiFi(Wireless Fidelity,无线保真技术)即IEEE ...

  8. 近场通信(NFC)手机支付解决方案

    NFC(Near Field Communication)是一种用于近距离无线通信的技术,它结合了近场通信技术和移动通信技术,能实现了电子支付.身份认证.票务.数据交换.防伪.广告等多种功能,是移动通 ...

  9. Android近场通信---NFC基础(二)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的In ...

最新文章

  1. php的_autoload函数实现自动加载类的使用
  2. 数据库初识--从MySQL 出发
  3. 《TOMCAT权威指南》摘抄
  4. 计算机网络综合实践任务书,计算机网络综合实任务书2012-11.doc
  5. 机器学习项目中不可忽视的一个密辛 - 大数定理、中心极限定理
  6. 计算机c盘空间满了应该怎么办,电脑C盘空间不足怎么办?1秒教你彻底释放C盘,拥有新机般的体验...
  7. MT6572 耳机驱动笔记
  8. Bmob后端云的集成与使用
  9. 电大本科计算机论文要求,【最新要求】电大毕业论文格式要求
  10. C#方法,可空类型,数组,集合,ArrayList排序,List,Hashtable和Dictionary
  11. ubuntu20.04使用微信,附高分屏适配方法
  12. 端到端深度学习在自动驾驶汽车上的应用
  13. hydra 配置类库 入门
  14. 步进电机S(SigMoid)曲线加减速【查表法】
  15. 如何计算地球球面上两个坐标点之间的弧度
  16. 计算几何(学习)模板
  17. 【R生态】普鲁克分析(Procrustes Analysis)
  18. 当电脑电池只充到50%就不充电了
  19. 第七节 设计电路与学书法学绘画并没有差别
  20. 华为——OSPF单区域实验配置,实验抓包分析,五种报文分析,六种LSA介绍,以及如何建立邻接关系的七种状态

热门文章

  1. platform_driver_register()--如何match之后调用probe
  2. 高性能HTTP加速器Varnish(管理维护篇)
  3. 异步串行通讯和同步串行通讯对比
  4. thymeleaf和freemarker比较
  5. mysql-proxy数据库中间件架构
  6. 关于neo4j初入门(2)
  7. Spring初始化机制
  8. 【Codeforces Round #450 (Div. 2) B】Position in Fraction
  9. Eclipse中activiti插件的安装
  10. WCF 内存入口检查失败 Memory gates checking failed