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

由于公司接了一个听上去感觉比较NB的项目,给某油田做派工系统 。并由小女子负责Android客户端的开发工作~~开发时的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来查询该卡的一些详细信息和数据。

更多相关文章

  1. Android运行时权限,6.0—9.0多版本,多终端(手机,TV盒子)130行代码一劳
  2. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  3. android 使用handler更新ui,使用与原理分析详解(附上代码以及截图)
  4. Ubuntu上adb找不到设备问题小结
  5. 1、android源代码下载与跟踪
  6. android经典开源代码集合
  7. ReactNative调用原生封装的代码和控件
  8. Android开发人员不得不收集的代码(持续更新中)

随机推荐

  1. 获取Android状态栏的高度
  2. Android中的getApplication()、getApplic
  3. Android(安卓)进程内存、CPU使用查看
  4. android Activity生命周期详解(图文)
  5. android去除状态栏和下面视图之前的黑线
  6. android 命令大全
  7. Android(安卓)APK安装过程及原理详解
  8. android之4.0控件switch自定义开关滑块、
  9. Android下的Console命令
  10. 在Android中使用Timer,并创建一个应用程序