欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 运维知识 > android >内容正文

android

android 文件mimetype-凯发k8官方网

发布时间:2024/10/8 android 0 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 android 文件mimetype_【android】nfc课件 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

nfc课件

1.nfc基础知识

  • 具体测试过程
  • 一、nfc基础知识

    1、nfc是什么

    nfc,即near field communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56m hz)无线通信技术,它提供了一种简单、触控式的凯发k8官方网的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。

    2、nfc与rfid的异同

    nfc是在rfid的基础上发展而来,nfc从本质上与rfid没有太大区别,都是基于地理位置相近的两个物体之间的信号传输。

    不过nfc与rfid还是有区别的,nfc技术增加了点对点通信功能,可以快速建立设备之间的p2p(点对点)无线通信,nfc设备彼此寻找对方并建立通信连接。p2p通信的双方设备是对等的,而rfid通信的双方设备是主从关系。

    **1. nfc只是限于13.56mhz的频段!而rfid的频段有低频(125khz到135khz),高频(13.56mhz)和超高频(860mhz到960mhz之间。
    2. 工作有效距离:nfc(小于10cm,所以具有很高的安全性),rfid距离从几米到几十米都有!**

    二、更细地说nfc

    跟nfc有关的常见的iso标准有:

    | iso 14443 | rfid卡标准(非接触ic卡),该标准又有很多子标准 | iso 7816 | 接触式ic卡标准 | iso 15693 | 某种射频卡标准吧,这个没查到资料 | iso 18092 | nfc标准

    也就说如果我要实现一个国际通用的rfid卡,就需要满足iso14443标准。

    我们再来说说现在射频卡常用的凯发k8官方网的解决方案:飞利浦的mifare,索尼的felica,中国人名银行的pboc。

    mifare卡有很多种版本(详见http://en.wikipedia.org/wiki/mifare),常见的版本有mifare classic 和mifare desfire,他们分别按照iso 14443-3 type a和iso 14443-4 type a来实现。

    felica卡之前想通过iso 14443 type c认证,但是由于某种原因最后失败了,所以他搞了自己的一套标准叫jis: x6319-4

    pboc是国内常见的支付卡,大部分城市的公交通都是基于pboc凯发k8官方网的解决方案实现的,据我个人的理解pboc卡使用的是基于iso7816接触式ic卡标准实现的接触或非接触式ic卡。

    最后我们解释一下nfc的常见数据格式:nfca/nfcb/nfcf/nfcv/isodep/ndef/ndefformatable/
    mifareclassic/mifareultralight(其实后两种是补充,可选的).

    这就是说不同的芯片(凯发k8官方网的解决方案、采用不同的标准实现的)卡中数据格式是不一样的,比如之前我们提到的mifare classic数据格式就是nfca,mifare desfire数据格式是isodep,我们使用的二代身份证用的就是nfcb,felica用的就是nfcf,德州仪器的vicinitycard卡用的是nfcv,而android分享文件就是实用的ndef格式传输数据。

    三、具体测试过程:

    1.首先要在androidmanifest.xml中声明如下配置信息:
    使用元素允许设备访问nfc硬件:

    使用元素设置最小sdk版本,笔者基于android 4.0环境,因此声明如下:

    下面这项不一定需要,如果你希望你的软件可以在android market中显示有nfc硬件,可以使用元素声明:

    四、nfc标签过滤

    当系统检测到一个nfc标签的时候,他会自动去寻找最合适的activity去处理这个intent.

    他所发出的这个intent将会有三种action:

    action_ ndef_ discovered:当系统检测到tag中含有ndef格式的数据时,且系统中有activity声明可以接受包含ndef数据的intent的时候,系统会优先发出这个action的intent。

    action_ tech_ discovered:当没有任何一个activity声明自己可以响应action_ndef_discovered时,系统会尝试发出tech的intent.即便你的tag中所包含的数据是ndef的,但是如果这个数据的mime type或uri不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是ndef.

    action_tag_discovered:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的tag类型的

    在activity的intent过滤xml声明中,你可以同时声明过滤这三种action.但是由之前所说,你应该知道系统在发送intent的时候是有优先级的,所以你最好清楚自己最想处理哪个。

    1:过滤action _ tag _ discovered:

    这个最简单,也是最后一个被尝试接受intent的选项。

    2:过滤action_ ndef_ discovered:

    其中最重要的应该算是data的mimetype类型了,这个定义的越准确,intent指向你这个activity的成功率就越高,否则系统可能不会发出你想要的ndef intent了。下面在讲如何使用ndef写入nfc标签的时候会多举几个类型的例子。

    3:过滤action_ tech_ discovered:

    你首先需要在你的 /res/xml 下面创建一个过滤规则文件。名字任取,比如可以叫做nfc_tech_filter.xml。这个里面定义的是nfc实现的各种标准,每一个nfc卡都会符合多个不同的标准,个人理解为这些标准有些相互之间也是兼容的。你可以在检测到nfc标签后使用gettechlist()方法来查看你所检测的tag到底支持哪些nfc标准。

    一个nfc_tech_filter.xml中可以定义多个结构组。每一组代表我声明我只接受同时满足这些标准的nfc标签。比如a组表示,只有同时满足isodep,nfca,nfcb,nfcf这四个标准的nfc标签的intent才能进入。a与b组之间的关系就是只要满足其中一个就可以了。换句话说,你的nfc标签技术,满足a的声明也可以,满足b的声明也可以。

    --------------------------------a组android.nfc.tech.isodep android.nfc.tech.nfca android.nfc.tech.nfcb android.nfc.tech.nfcf-----------------------------------------b组android.nfc.tech.nfcvandroid.nfc.tech.ndefandroid.nfc.tech.ndefformatable android.nfc.tech.mifareclassicandroid.nfc.tech.mifareultralight

    在androidmanifest文件中声明xml过滤的举例如下

    ----这个就是你的资源文件名

    五:nfc标签前台分发系统

    之所以把他也归类在nfc的过滤里面,主要是因为他跟解析nfc标签到不是那么的紧密,他解决的是接受哪些nfc标准的标签问题。所以更接近nfc的过滤。

    什么叫nfc的前台发布系统?就是说当我们已经打开我们的应用的时候,那么通过这个前台发布系统的设置,我们可以让我们已经启动的activity拥有更高的优先级来依据我们在代码中定义的标准来过滤和处理intent,而不是让别的声明了intent filter的activity来干扰,甚至连自己声明在androidmanifest中的intent filter都不会来干扰。也就是说foreground dispatch的优先级大于intent filter。

    第一种情况:当你的activity没有启动的时候,去扫描tag,那么系统中所有的intent filter都将一起参与过滤。

    第二种情况:当你的actiity启动了,去扫描tag时,那么将直接使用你在foreground dispatch中代码写入的过滤标准。如果这个标准没有命中任何intent,那么系统将使用所有activity声明的intent filter xml来过滤。

    在oncreate中你可以添加如下代码

    // create a generic pendingintent that will be deliver to this activity. the nfc stack will fill in the intent with the details of the discovered tag before delivering to this activity.mpendingintent = pendingintent.getactivity(this, 0, new intent(this, getclass()).addflags(intent.flag_activity_single_top), 0);// 做一个intentfilter过滤你想要的action 这里过滤的是ndef intentfilter ndef = new intentfilter(nfcadapter.action_ndef_discovered); //如果你对action的定义有更高的要求,比如data的要求,你可以使用如下的代码来定义intentfilter // try { // ndef.adddatatype("*/*"); // } catch (malformedmimetypeexception e) { // // todo auto-generated catch block // e.printstacktrace(); // } //生成intentfilter mfilters = new intentfilter[] {ndef};// 做一个tech-list。可以看到是二维数据,每一个一维数组之间的关系是或,但是一个一维数组之内的各个项就是与的关系了 mtechlists = new string[][] { new string[] { nfcf.class.getname()},new string[]{nfca.class.getname()},new string[]{nfcb.class.getname()},new string[]{nfcv.class.getname()}}; 在onpause和 onresume中需要加入相应的代码。 public void onpause() {super.onpause(); //反注册 madapter.disableforegrounddispatch(this); }public void onresume() { super.onresume(); //设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的tag action。也就是说系统会主动发tag intent。 madapter.enableforegrounddispatch(this, mpendingintent, mfilters, mtechlists); }

    六、开发实例(读取数据)

    androidmanifest.xml:

    res/xml/nfc_tech_filter.xml

    android.nfc.tech.mifareclassic

    permissions

    当手机开启了nfc,并且检测到一个tag后,tag分发系统会自动创建一个封装了nfc tag信息的intent。如果多于一个应用程序能够处理这个intent的话,那么手机就会弹出一个框,让用户选择处理该tag的activity。tag分发系统定义了3中intent。按优先级从高到低排列为:
    ndef_discovered, tech_discovered, tag_discovered
    当android设备检测到有nfc tag靠近时,会根据action申明的顺序给对应的activity 发送含nfc消息的 intent。
    此处我们使用的intent-filter的action类型为tech_discovered从而可以处理所有类型为action_tech_discovered并且使用的技术为nfc_tech_filter.xml文件中定义的类型的tag。

    res/layout/activity_main.xml

    src/com/example/nfc/mainactivity.java

    package com.example.nfc;import android.app.activity; import android.content.intent; import android.nfc.nfcadapter; import android.nfc.tag; import android.nfc.tech.mifareclassic; import android.os.bundle; import android.widget.textview;public class mainactivity extends activity {nfcadapter nfcadapter;textview promt;@overrideprotected void oncreate(bundle savedinstancestate) {super.oncreate(savedinstancestate);setcontentview(r.layout.activity_main);promt = (textview) findviewbyid(r.id.promt);//获取默认的nfc控制器nfcadapter = nfcadapter.getdefaultadapter(this);if (nfcadapter == null) {promt.settext("设备不支持nfc");return;}if (!nfcadapter.isenabled()) {promt.settext("请在系统设置中先启用nfc功能");return;}}@overrideprotected void onresume() {super.onresume();//得到是否检测到action_tech_discovered触发if (nfcadapter.action_tech_discovered.equals(getintent().getaction())) {//处理该intentprocessintent(getintent());}}//字符序列转换为16进制字符串private string bytestohexstring(byte[] src) {stringbuilder stringbuilder = new stringbuilder("0x");if (src == null || src.length <= 0) {return null;}char[] buffer = new char[2];for (int i = 0; i < src.length; i ) {buffer[0] = character.fordigit((src[i] >>> 4) & 0x0f, 16);buffer[1] = character.fordigit(src[i] & 0x0f, 16);// system.out.println(buffer);stringbuilder.append(buffer);}return stringbuilder.tostring();}/*** parses the ndef message from the intent and prints to the textview*/private void processintent(intent intent) {//取出封装在intent中的tagstring tmp = "此tag到底支持哪些nfc标准:n";tag tagfromintent = intent.getparcelableextra(nfcadapter.extra_tag);//获取支持哪些nfc标准 : gettechlistfor (string tech : tagfromintent.gettechlist()) {system.out.println(tech);tmp = tech "n";}boolean auth = false;//读取tagmifareclassic mfc = mifareclassic.get(tagfromintent);try {//enable i/o operations to the tag from this tagtechnology object.mfc.connect();int type = mfc.gettype();//获取tag的类型int sectorcount = mfc.getsectorcount();//获取tag中包含的扇区数string types = "";switch (type) {case mifareclassic.type_classic:types = "type_classic";break;case mifareclassic.type_plus:types = "type_plus";break;case mifareclassic.type_pro:types = "type_pro";break;case mifareclassic.type_unknown:types = "type_unknown";break;}tmp = "卡片类型:" types "n共" sectorcount "个扇区n共" mfc.getblockcount() "个块n存储空间:" mfc.getsize() "bn";for (int j = 0; j < sectorcount; j ) {//尝试去获取每个sector的认证,只有认证通过才能访问auth = mfc.authenticatesectorwithkeya(j, mifareclassic.key_default);int bcount;int bindex;if (auth) {tmp = "sector " j ":验证成功n";//读取扇区中的块;这句话其实不是必须的,因为每个sector中本来就只有4个blockbcount = mfc.getblockcountinsector(j);//我们可以得到每一个sector中的第一个block的编号bindex = mfc.sectortoblock(j);//循环4次拿出一个sector中所有的block//每次循环bindex会去 ,然后可以得出每一个block的数据。这些数据是字节码,所以你还有一个翻译的工作要做for (int i = 0; i < bcount; i ) {byte[] data = mfc.readblock(bindex);tmp = "block " bindex " : " bytestohexstring(data) "n";bindex ;}} else {tmp = "sector " j ":验证失败n";}}promt.settext(tmp);} catch (exception e) {e.printstacktrace();}} }

    关于mifareclassic卡的背景介绍:数据分为16个区(sector) ,每个区有4个块(block) ,每个块可以存放16字节的数据。
    每个区最后一个块称为trailer ,主要用来存放读写该区block数据的key ,可以有a,b两个key,每个key 长度为6个字节,缺省的key值一般为全ff或是0. 由 mifareclassic.key_default 定义。
    因此读写mifare tag 首先需要有正确的key值(起到保护的作用),如果鉴权成功
    然后才可以读写该区数据。

    代码下载:http://download.csdn.net/detail/yingpaixiaochuan/9162381

    参考链接:
    android nfc 开发实例

    nfca/nfcb/nfcf/nfcv/isodep/ndef/mifare/felica/pboc/isoxxxx 都是些什么鸟玩意?

    android nfc学习笔记(一)

    总结

    以上是凯发k8官方网为你收集整理的android 文件mimetype_【android】nfc课件的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图