由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程:

大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/docs/index.html

目前NFC应用的大的框架上的理解:

我使用的API LEVEL是19,支持的API有三个:android.nfc,android.nfc.cardemulator,android.nfc.tech

NFC在手机上的应用大体分为两类:读卡器和卡

android.nfc.cardemulator接口是为NFC作为卡应用提供的接口,在较低版本的API上是没有的

android.nfc.tech,android.nfc接口是为NFC作为读卡器应用提供的接口

首先说作为卡,nfc有两种实现方式,一个是使用NFC芯片作为卡,另一个是使用SIM作为卡

Figure 1. NFC card emulation with a secure element.

至于从读卡器发送的指令到底是传递到NFC芯片还是SIM由NFC Controler控制,图中Secure Element是指SIM,Host-CPU指NFC芯片

android提供HostApduService用于NFC芯片,OffHostApduService用于SIM芯片,传递方向在res/xml文件中通过AID来控制

ps:Host-Based Card Emulator 简称为HCE

代码实现:

AndroidManifest.xml 中 配置service,因为作为卡实现的话,NFC功能是作为service存在的

<service android:name="com.shhic.nfcapp.NFCService" android:exported="true"
            android:permission="android.permission.BIND_NFC_SERVICE">
            <intent-filter>
                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
            </intent-filter>
            <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
                android:resource="@xml/apduservice"/>
        </service>

res/xml/apduservice.xml 中配置service响应的AID

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
                android:category="other">
        <aid-filter android:name="F0010203040506"/>
    </aid-group>
</host-apdu-service>

配置文件完成后编写service的处理方法:

NFCService需要继承HostApduService,如果需要与Activity通信,建议采用广播方式

也可以自己实现观察者模式,只是这样就需要持有Activity的引用,感觉不太好

NFCService.java

public class NFCService extends HostApduService {

private Intent intent = new Intent("com.example.communication.RECEIVER");
    
    @Override
    public void onCreate()
    {
        //启动Acivity
        Intent i = new Intent();
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//需要启动的Activity不是当前Activity的时候需要用FLAG_ACTIVITY_NEW_TASK
        i.setAction("com.apdu.nfc");
        getApplication().startActivity(i);
        Toast.makeText(getApplicationContext(), "Service启动", Toast.LENGTH_LONG).show();
        
    }
    @Override
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {//当注册的AID被选中后,后续指令被分发到这个处理函数中
        byte[] sw = new byte[]{(byte)0x90,(byte)0x00};
        byte[] response = new byte[5];
        if (commandApdu[0]==(byte)0x00 &&commandApdu[1]==(byte)0xA4&& commandApdu[2]==(byte)0x04
                && commandApdu[4]==(byte)0x07&& commandApdu[5]==(byte)0xF0)
        {
            return sw;
        }
        else
        {
            //apdu处理逻辑
            switch(commandApdu[1])
            {
            case (byte)0xA8:
             
                break;
            case (byte)0xAE:
               
                break;
            default:
                return sw;
            }
        }

intent.putExtra("command", commandApdu);
        intent.putExtra("response", response);
        sendBroadcast(intent);    //利用广播与Activity通信
        
        return response;   //SW值需要包含在response中
    }

@Override
    public void onDeactivated(int reason) {
        if (reason==HostApduService.DEACTIVATION_DESELECTED)
        {
            Toast.makeText(getApplicationContext(), "已选择其它应用", Toast.LENGTH_LONG).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(), "连接断开", Toast.LENGTH_LONG).show();
        }
    }
    
    @Override  
    public void onDestroy()
    {  
        Toast.makeText(getApplicationContext(), "Service关闭", Toast.LENGTH_LONG).show();
        super.onDestroy();  
    }

框架搭建好剩余的事情就很简单了,apdu的处理逻辑在processCommandApdu方法中实现即可

以上是Host-CPU方式的实现,SIM方式,API介绍中说该方式没有提供可供操作的API,也就是说Android不会监听SIM卡与读卡器之间的通信

所以NFCOffService 只需要实现onBind接口,这样绑定该Service的Activity可以对NFCOffService进行有限操作

public class NFCOffService extends OffHostApduService {
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

}

android NFC 开发学习笔记(1)相关推荐

  1. Android底层开发学习笔记 第一天

    今天,开始学习Android底层的开发.(注:我是新手小白,纯粹学习笔记,大神们可以直接略过了) 第一部分 编译运行我的第一个Android system. 准备工作: 下载源码:包括u-boot源码 ...

  2. Android 应用开发学习笔记(2 of 2,from hitwh)

    Android 应用开发 注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章(1 of 2)开头提供了原版文章的 pdf 资源下载,推荐下载 pdf ...

  3. Android 应用开发学习笔记(1 of 2,from hitwh)

    Android 应用开发 注意!由于文章图片是通过typora一键上传图片实现,该功能还存在bug,容易导致图片顺序混乱,文章开头提供了原版文章的 pdf 资源下载,推荐下载 pdf 后观看,或评论区 ...

  4. Android应用开发学习笔记之事件处理

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...

  5. Android游戏开发学习笔记(三):视频的播放

    一.在命令行下输入mksdcard 512M c:\sdcard.img命令,创建sdcard镜像文件. 二.单击Eclipse的菜单命令"Window/Preferences", ...

  6. android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)

    /**  * 画笔  *   * @author 岳振华  *   */ @SuppressWarnings("unused") public class PaintSruface ...

  7. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

  8. Android 开发学习笔记

    Android 开发学习笔记 Lesson1 (2.28) android之父: Andy Rubin(安迪 鲁宾) Lesson2 (3.3) android 的优点: 开放.网络接入自由.丰富的硬 ...

  9. IOS开发学习笔记(一)

    概述: iOS是苹果开发的手持设备操作系统(iPhone,iPad,iPod touch,iPad mini). 基于UNIX,层次架构:核心操作系统层(Core OS)-> 核心服务层(Cor ...

最新文章

  1. QT教程3: 日期和时间的对象操作
  2. 3月30日高项作业(采购、信息和配置管理)
  3. Codeforces 1109F. Sasha and Algorithm of Silence's Sounds
  4. ndroid网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合...
  5. Spark RDD使用详解4--Key-Value型Transformation算子
  6. Linux应用:FTP
  7. java不适合开发cv吗_JavaCV开发环境的配置
  8. 程序员面试-并发大数据分布式
  9. 微软发布2016年5月安全补丁 提醒及时修复
  10. 如何创建从硬盘安装的硬像文件
  11. 【渝粤教育】广东开放大学 外国文学专题 形成性考核 (55)
  12. 基于OpenCV实现视频的循环播放
  13. 美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年
  14. 音频转换成mp3格式的步骤
  15. 【最新面试技巧分享】面试官想看到的以及面试者需要准备的!
  16. sklearn中FastICA接口的使用方法
  17. windows 重新启动 postgresq
  18. C++性能优化系列——3D高斯核卷积计算(二)FMA向量化计算一维卷积
  19. Google新闻中国版
  20. 【软考】软件攻城狮考试(一)——总览

热门文章

  1. 记:《洛克菲勒留给儿子的38封信》-- 28
  2. 解决Gradle在IDEA中运行Java17的Junit单元测试程序报错:module java.base does not “opens java.lang“ to unnamed module
  3. 基于Distflow的最优潮流模型(OPF)--模型推导篇
  4. * (HEAD detached at origin/xxx)原因及解决方案
  5. 【橙果工作室】【网站组】2021.11.11内容
  6. 麓言信息平面设计可以转行UI设计吗?
  7. Custom Elements详解
  8. 让这些浏览器插件和工具来帮你破解突破百度网盘下载速度太慢的难题!
  9. 京东热 key 探测框架新版发布,单机 QPS 可达 35 万
  10. android swf 用什么打开方式,安卓swf文件用什么打开_swf文件用什么打开 mac_swf文件用什么打开 ipad...