zoukankan      html  css  js  c++  java
  • Android NFC近场通信02----读写卡的准备工作

                          Android NFC近场通信02----读写卡的准备工作

         因为公司接了一个听上去感觉比較NB的项目。给某油田做派工系统 。并由小女子负责Androidclient的开发工作~~开发时的Android设备看上去是比較高大上哈,防爆的,事实上非常多次同事们都想开玩笑的说试试摔地上,都防爆嘛。那肯定摔不坏的哈~~开发过程中须要用到NFC技术。所以就在网上学习并整理了一下关于Android nfc相关的知识~好了,切入主题。本文写读写卡前的准备工作:

    ps:这一系列有部分为网上整理所得。感谢感谢~~当然还包括小女子的部分代码~~~

         NFC是一套短距离的无线通信,通常距离是4厘米或更短。

    NFC工作频率是13.56M Hz,传输速率是106kbit/s 到848kbit/s. NFC总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场能够给被动目标供电。这些被动的目标包含不须要电源的标签。卡,也能够是有电源的设备。

         与其它无线通信技术比較, 比如蓝牙和WiFi。 NFC提供更低贷款和距离,而且低成本,不须要供电,不须要实现匹配,整个通信过程不过短短的靠近一秒就能完毕。

         一个带有NFC支持的android设备一般是一个发起者。

    也能够作为NFC的读写设备。

    他将检測NFC tags而且打开一个Activity来处理. Android 2.3.3还有支持有限的P2P。

    Tags分非常多种,当中简单的仅仅提供读写段,有的仅仅能读。复杂的tags能够支持一些运算。加密来控制对tags里数据段的读写。甚至一些tags上有简单的操作系统,同意一些复杂的交互和能够运行一些代码。

    本文的代码样例是基于API10的。

    要在Android手机中使用NFC。必须在AndroidManifest.xml中例如以下配置:

    <uses-feature android:name="android.hardware.nfc"
            android:required="true" />
    <uses-permission android:name="android.permission.NFC" />

    Tag公布系统

    当android设备扫描到一个NFC tag,通用的行为是自己主动找最合适的Activity会处理这个tag Intent而不须要用户来选择哪个Activity来处理。

    由于设备扫描NFC tags是在非常短的范围和时间,假设让用户选择的话,那就有可能须要移动设备,这样将会打断这个扫描过程。你应该开发你仅仅处理须要处理的tags的Activity,以防止让用户选择使用哪个Activity来处理的情况。Android提供两个系统来帮助你正确的识别一个NFC tag是否是你的Activity想要处理的:Intent公布系统和前台Activity公布系统。

    Intent公布系统检查全部Activities的intent filters,找出那些定义了能够处理此tag的Activity,假设有多个Activity都配置了处理同一个tag Intent。那么将使用Activity选择器来让用户选择使用哪个Activity。

    用户选择之后。将使用选择的Activity来处理此Intent.

    前台公布系统同意一个Activity覆盖掉Intent公布系统而首先处理此tag Intent。这要求你将要处理Tag Intent的Activity执行在前台,这样当一个NFC tag被扫描到,系统先检測前台的Activity是否支持处理此Intent,假设支持,即将此Intent传给此Activity,假设不支持。则转到Intent公布系统。

     

    曾经台前台公布系统为例,须要编写例如以下代码:

    1. 定义变量

    private NfcAdapter mAdapter;
        private String[][] techList;
        private IntentFilter[] intentFilters;
        private PendingIntent pendingIntent;
        private Tag tag;

     

    2. 加入下列代码到Activity的onCreate() 方法里:

    复制代码
    //获取nfc适配器
            mAdapter = NfcAdapter.getDefaultAdapter(this);
            //定义程序能够兼容的nfc协议,样例为nfca和nfcv
            //在Intent filters里声明你想要处理的Intent,一个tag被检測到时先检查前台公布系统,
            //假设前台Activity符合Intent filter的要求,那么前台的Activity的将处理此Intent。
            //假设不符合,前台公布系统将Intent转到Intent公布系统。假设指定了null的Intent filters。
            //当随意tag被检測到时,你将收到TAG_DISCOVERED intent。

    因此请注意你应该仅仅处理你想要的Intent。 techList = new String[][] { new String[] { android.nfc.tech.NfcV.class.getName() }, new String[] { android.nfc.tech.NfcA.class.getName() } }; intentFilters = new IntentFilter[] { new IntentFilter( NfcAdapter.ACTION_TECH_DISCOVERED), }; //创建一个 PendingIntent 对象, 这样Android系统就能在一个tag被检測到时定位到这个对象 pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    复制代码

    3. 在onNewIntent方法中:

        public void onNewIntent(Intent intent) {
            tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            
            return;
        }

    4. 在OnPause方法中:

        @Override
        protected void onPause() {
            super.onPause();
            mAdapter.disableForegroundDispatch(this);
        }

     

    4. 在OnResume方法中:

    复制代码
    @Override
        protected void onResume() {
            super.onResume();
            //使用前台公布系统
            mAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters,
                    techList);
            }
        }
    复制代码

     

    定义了这些方法以后,执行程序,在不锁屏的情况下,使用NFCV或NFCA的NFC卡靠近的手机的时候OnNewIntent就会被触发。Tag就能够被获取到,能够使用获取到的TAG来查询该卡的一些具体信息和数据。

  • 相关阅读:
    Spring 中出现Element : property Bean definitions can have zero or more properties. Property elements correspond to JavaBean setter methods exposed by the bean classes. Spring supports primitives, refer
    java定时器schedule和scheduleAtFixedRate区别
    hql语句中的select字句和from 字句
    使用maven搭建hibernate的pom文件配置
    Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from http://repo.maven.apache.org/ maven2 was cached in the local repository, resolution will not be reattempted until the update interv
    对于文件File类型中的目录分隔符
    hibernate的事务管理和session对象的详解
    解决mac 中的myeclipse控制台中文乱码问题
    ibatis selectKey用法问题
    Java中getResourceAsStream的用法
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6812379.html
Copyright © 2011-2022 走看看