android实现NFC读写功能

一、NFC是什么?

近距离无线通讯技术,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体公司)、诺基亚和索尼共同研制开发,其基础是RFID及互连技术。近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种读取模式。

NFC通信模式主要有以下几种(信息来源):

1.读卡器模式(Reader/writer mode):

作为非接触读卡器使用,比如从海报或者展览信息电子标签上读取相关信息。亦可实现NFC手机之间的数据交换,对于企业环境的中的文件共享,或者对于多玩家的游戏应用,都将带来诸多的便利。

2. 点对点模式(P2Pmode):

此模式和红外线差不多,可用于数据交换,只是传输距离较短,传输创建速度较快,传输速度也快些,功耗低(蓝牙也类似)。将两个具备NFC功能的设备无线链接,能实现数据点对点传输,如下载音乐、交换图片或者同步设备地址薄。因此通过NFC,多个设备如数位相机、PDA、计算机和手机之间都可以交换资料或者服务。

3.卡模式(Cardemulation):

这个模式其实就是相当于一张采用RFID技术的IC卡,可以替代大量的IC卡(包括信用卡)使用的场合,如商场刷卡、公交卡、门禁管制,车票,门票等等。此种方式下,有一个极大的优点,那就是卡片通过非接触读卡器的 RF 域来供电,即使寄主设备(如手机)没电也可以工作。

二、如何使用与集成到项目?

1、首先在manifests里面声明NFC和添加相应的权限;

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

2、在Activity标签中声明识别NFC标签;

<activity android:name=".Activity.Main.NFCActivity">
    <intent-filter>
        <action android:name="android.nfc.action.TAG_DISCOVERED" />  

        <category android:name="android.intent.category.DEFAULT" />  

        <data android:mimeType="*/*" />
    </intent-filter>
</activity>

3、封装NFC的读写,方便调用;

public class NfcUtils {  

    //nfc
    public static NfcAdapter mNfcAdapter;
    public static IntentFilter[] mIntentFilter = null;
    public static PendingIntent mPendingIntent = null;
    public static String[][] mTechList = null;  

    /**
     * 构造函数,用于初始化nfc
     */
    public NfcUtils(Activity activity) {
        mNfcAdapter = NfcCheck(activity);
        NfcInit(activity);
    }  

    /**
     * 检查NFC是否打开
     */
    public static NfcAdapter NfcCheck(Activity activity) {
        NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
        if (mNfcAdapter == null) {
            return null;
        } else {
            if (!mNfcAdapter.isEnabled()) {
                Intent setNfc = new Intent(Settings.ACTION_NFC_SETTINGS);
                activity.startActivity(setNfc);
            }
        }
        return mNfcAdapter;
    }  

    /**
     * 初始化nfc设置
     */
    public static void NfcInit(Activity activity) {
        mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        try {
            filter.addDataType("*/*");
        } catch (IntentFilter.MalformedMimeTypeException e) {
            e.printStackTrace();
        }
        mIntentFilter = new IntentFilter[]{filter, filter2};
        mTechList = null;
    }  

    /**
     * 读取NFC的数据
     */
    public static String readNFCFromTag(Intent intent) throws UnsupportedEncodingException {
        Parcelable[] rawArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawArray != null) {
            NdefMessage mNdefMsg = (NdefMessage) rawArray[0];
            NdefRecord mNdefRecord = mNdefMsg.getRecords()[0];
            if (mNdefRecord != null) {
                String readResult = new String(mNdefRecord.getPayload(), "UTF-8");
                return readResult;
            }
        }
        return "";
    }  

    /**
     * 往nfc写入数据
     */
    public static void writeNFCToTag(String data, Intent intent) throws IOException, FormatException {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        Ndef ndef = Ndef.get(tag);
        ndef.connect();
        NdefRecord ndefRecord = NdefRecord.createTextRecord(null, data);
        NdefRecord[] records = {ndefRecord};
        NdefMessage ndefMessage = new NdefMessage(records);
        ndef.writeNdefMessage(ndefMessage);
    }  

    /**
     * 读取nfcID
     */
    public static String readNFCId(Intent intent) throws UnsupportedEncodingException {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        String id = ByteArrayToHexString(tag.getId());
        return id;
    }  

    /**
     * 将字节数组转换为字符串
     */
    private static String ByteArrayToHexString(byte[] inarray) {
        int i, j, in;
        String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
        String out = "";  

        for (j = 0; j < inarray.length; ++j) {
            in = (int) inarray[j] & 0xff;
            i = (in >> 4) & 0x0f;
            out += hex[i];
            i = in & 0x0f;
            out += hex[i];
        }
        return out;
    }
} 

4、在NFCActivity代码中的使用、使用标签的前台调度系统;

@Override
public void initData() {
    //nfc初始化设置
    NfcUtils nfcUtils = new NfcUtils(this);
} 
@Override
protected void onResume() {
    super.onResume();
    //开启前台调度系统
    NfcUtils.mNfcAdapter.enableForegroundDispatch(this, NfcUtils.mPendingIntent, NfcUtils.mIntentFilter, NfcUtils.mTechList);
}
@Override
protected void onPause() {
    super.onPause();
    //关闭前台调度系统
    NfcUtils.mNfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    //当该Activity接收到NFC标签时,运行该方法
    //调用工具方法,读取NFC数据
    String str = NfcUtils.rendFromTag(intent);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现读取NFC卡的编号

    本文实例为大家分享了Android读取NFC卡的编号具体代码,供大家参考,具体内容如下 NFC相关androidManifest文件设置: 一.权限:<uses-permission android:name="android.permission.NFC"/> 二.sdk级别限制:<uses-sdk android:minSdkVersion="10"/> 三.特殊功能限制<uses-feature android:name=&quo

  • 深入分析Android NFC技术 android nfc开发

    从概念,实现原理以及最红实现的源码等有助于大家对NFC技术有更深入的理解. NFC 是 Near Field Communication 缩写,即近距离无线通讯技术.可以在移动设备.消费类电子产品.PC 和智能控件工具间进行近距离无线通信.简单一点说,nfc 功能是什么?nfc功能有什么用?其实NFC提供了一种简单.触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务.NFC 技术允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英吋)内,交换数据,其传输速度有106Kbi

  • Android实现NFC读取校园卡

    本文实例为大家分享了Android实现NFC读取校园卡的具体代码,供大家参考,具体内容如下 主程序: package com.nfclab.stuCard; import java.io.IOException; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import andro

  • android模拟器开发和测试nfc应用实例详解

    从Android2.3开始支持NFC.不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片.而且如果测试NFC传输文件时至少需要两部支持NFC的手机.当然,如果测试读写NFC标签,还需要一些NFC标签或帖子.而且NFC在模拟器上时不能运行的.所以从这一点来说,NFC开发需要更多的设备,比较麻烦.这也蓝牙.传感器是一样的.都不能在Android模拟器上开发和测试.真不知道Google为什么不解决这一问题. 不过这种问题也不是不能解决,而且并不

  • 详解Android平台上读写NFC标签

    本文主要谈一谈Android上有关NFC标签的读写问题(NDEF格式). 硬件环境:android4.0(Sony M35h)+可读可写的NFC标签若干 一.NFC基础知识 1.NFC是什么? NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术,它提供了一种简单.触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务. 2.NFC的技术优势? 与蓝牙相比:NFC操作简单,配对迅速

  • android中NFC读写功能的实现方法

    本文实例为大家分享了android中NFC读写功能的具体代码,供大家参考,具体内容如下 首先检查一下设备是否支持NFC功能 private void checkNFCFunction() { // TODO Auto-generated method stub mNfcAdapter = NfcAdapter.getDefaultAdapter(this); // check the NFC adapter first if (mNfcAdapter == null) { // mTextVie

  • Android 使用手机NFC的读取NFC标签数据的方法

    一 你需要准备的: 一部有nfc的手机,一张有nfc标签的卡 二 nfc简介 nfc(近距离无线通讯技术),是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在单一芯片上集成感应式读卡器.感应式卡片和点对点通信的功能,利用移动终端实现移动支付.电子票务.门禁.移动身份识别.防伪等应用. 三 nfc过滤标签的设置 3-1 在Manifest添加权限: 在xml里添加nfc的使用权限 <uses-permission android:name="android.permissio

  • Android实现读取NFC卡卡号示例

    Android实现读取NFC卡卡号示例,具体如下: 1.权限 <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> 2.注册(静态) <intent-filter> <action andro

  • android nfc常用标签读取总结

    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式.废话到此为止,下面开始正文. NFC(Near Field Communication,近场通信)是一种数据传输技术.与Wi-Fi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4厘米.但是NFC传输速度要比红外快.目前NFC已经出现了一些应用,例如电子标签识别.刷手机.点对点付款.身份识别.信息记录等,本篇文章的目的是为大家揭开NFC标签的面纱. 下面我们先从NFC的工作模式开始阐述NFC

  • android实现NFC读写功能

    一.NFC是什么? 近距离无线通讯技术,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体公司).诺基亚和索尼共同研制开发,其基础是RFID及互连技术.近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内.其传输速度有106 Kbit/秒.212 Kbit/秒或者424 Kbit/秒三种.目前近场通信已通过成为ISO/IEC IS 18092国际标准.ECMA-340标准与ETSI

  • android实现文件读写功能

    本文实例为大家分享了android实现文件读写功能的具体代码,供大家参考,具体内容如下 读取: public static String _getJsonString(String fileName) throws IOException { if ((fileName == null) || fileName.isEmpty()) { return ""; } String retString = ""; FileInputStream fis = null; S

  • Android中文件读写(输入流和输出流)操作小结

    1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存. (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘. (3).在读取文件(特别是文本文件)时,也是一个字节一个字节的读取以形成字节序列. 2. 字节流和字符流的区别: (1).字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,字符流就可以. (2).字节流转换成字符流可以用InputStreamReader,OutputStreamWriter. 一般我们在

  • Android实现摄像头拍照功能

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用. 知识点介绍: 使用权限:调用手机自身设备功能(摄像头拍照功能),应该确保已经在AndroidManifest.xml中正确声明了对摄像头的使用及其它相关的feature. <!--摄像头权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!--存储权限 SD卡读写权限

  • uni-app实现NFC读取功能

    本文实例为大家分享了uni-app实现NFC读取功能的具体代码,供大家参考,具体内容如下 好久没有写博客了,今天难得有空重新记录自己学习的点点滴滴. 1.NFC方法.js // 包路径 const package_NdefRecord = 'android.nfc.NdefRecord'; const package_NdefMessage = 'android.nfc.NdefMessage'; const package_TECH_DISCOVERED = 'android.nfc.acti

  • Android入门之读写本地文件的实现

    目录 简介 课程目标 UI端 后端代码 运行效果 简介 为了这个系列,我的代码已经准备到了第150天了.接下来的内容会越来越精彩,我们也越来越开始进入Android的一些高级功能上的编程了.今天我们就要讲Android中对本地文件进行读写的全过程. 课程目标 输入文件名.输入文件内容后按[保存到SD卡],可以把文件保存到SD卡根目录: 输入文件名,按[读取SD卡中的文件],可以根据输入的文件名把文件内容显示成Toast: 搞清Android中对于SD卡读写时所需要的静态权限申请.动态权限申请:

  • Android中Activity常用功能设置小结(包括全屏、横竖屏等)

    本文实例讲述了Android中Activity常用功能设置小结(包括全屏.横竖屏等).分享给大家供大家参考,具体如下: Activity全屏设置 方式1:AndroidManifest.xml 复制代码 代码如下: <activity android:name="myAcitivty"  android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 方式2:代码实现 复制代码 代码如下: re

  • Android 获取随机验证码功能示例

    验证码功能在各大网站都能用到,下面小编通过实例代码给大家分享Android 获取随机验证码功能,具体代码如下所示: package cn.hk.image; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; impo

随机推荐