热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了Android使用手机NFC的读取NFC标签数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一 你需要准备的:

一部有nfc的手机,一张有nfc标签的卡

二 nfc简介

nfc(近距离无线通讯技术),是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。

三 nfc过滤标签的设置

3-1 在Manifest添加权限:

在xml里添加nfc的使用权限

这个是限制安装权限,只给有nfc功能的手机安装(可选)

3-2 nfc的过滤方式有以下:

  • ACTION_NDEF_DISCOVERED,
  • ACTION_TECH_DISCOVERED,
  • ACTION_TAG_DISCOVERED三种。过滤器的作用是过滤掉杂质,剩下的就是我们需要的了。这三种过滤方式可同时配置,可以比方成从上到下三层,只要是符合某一层过滤器要求的,过滤完就停止往下一层。

在Activity的filter里面添加对应需要的权限:

ACTION_NDEF_DISCOVERED,


...
      
        
      
...

ACTION_TECH_DISCOVERED:

/res/xml(自己新建xml文件夹)下新建一个nfc_tech_filter.xml文件,添加进你需要支持的标签类型。(下面的配置项可多选)。下列示例是支持与NfcA和Ndef技术的NFC标签匹配。


  
    
  
    
    android.nfc.tech.NfcA
    
    
    
    android.nfc.tech.Ndef
    
    
    
  

  


...
      
        
      

      


...

ACTION_TAG_DISCOVERED,可以添加如下权限


···
      
        
      
···


3-3 识别标签的顺序

四 nfc读操作(我们读取NEDF数据,其他公交卡类型的数据可以自行研究)

1 初始化nfc工具,判断是否存在nfc和nfc是否打开

2 感应到nfc标签后,读取解析对应nfc类型的标签数据

3 回传显示

代码如下:

public class NfcActivity extends Activity {

  private static final String TAG = "NfcActivity";
  private TextView tvNFCMessage;
  private PendingIntent mPendingIntent;
  private NfcAdapter mNfcAdapter;
  private Button btnClean;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_nfc);
    Log.i(TAG, "onCreate: ");
    btnClean = findViewById(R.id.btn_clean);
    tvNFCMessage = findViewById(R.id.tv_show_nfc);


    resolveIntent(getIntent());

    //初始化nfc
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    mPendingIntent = PendingIntent.getActivity(this, 0,
        new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    if (mNfcAdapter == null) {
      Toast.makeText(NfcActivity.this, "nfc is not available", Toast.LENGTH_SHORT).show();
      finish();
      return;
    }


    btnClean.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        tvNFCMessage.setText("");
      }
    });
  }

  @Override
  protected void onResume() {
    super.onResume();
    Log.i(TAG, "onResume: ");
    if (mNfcAdapter != null) { //有nfc功能
      if (mNfcAdapter.isEnabled()) {
        //nfc功能打开了
        //隐式启动
        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
      } else {
        Toast.makeText(NfcActivity.this, "请打开nfc功能", Toast.LENGTH_SHORT).show();
      }
    }
  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.i(TAG, "onNewIntent: ");
    setIntent(intent);
    if (mNfcAdapter != null) { //有nfc功能
      if (mNfcAdapter.isEnabled()) {//nfc功能打开了
        resolveIntent(getIntent());
      } else {
        Toast.makeText(NfcActivity.this, "请打开nfc功能", Toast.LENGTH_SHORT).show();
      }
    }
  }


  @Override
  protected void onPause() {
    super.onPause();
    if (mNfcAdapter != null) {
      mNfcAdapter.disableForegroundDispatch(this);
    }
  }

  //初次判断是什么类型的NFC卡
  private void resolveIntent(Intent intent) {
    NdefMessage[] msgs = NfcUtil.getNdefMsg(intent); //重点功能,解析nfc标签中的数据

    if (msgs == null) {
      Toast.makeText(NfcActivity.this, "非NFC启动", Toast.LENGTH_SHORT).show();
    } else {
      setNFCMsgView(msgs);
    }

  }

  /**
   * 显示扫描后的信息
   *
   * @param ndefMessages ndef数据
   */
  @SuppressLint("SetTextI18n")
  private void setNFCMsgView(NdefMessage[] ndefMessages) {
    if (ndefMessages == null || ndefMessages.length == 0) {
      return;
    }

//    tvNFCMessage.setText("Payload:" + new String(ndefMessages[0].getRecords()[0].getPayload()) + "\n");

    Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    tvNFCMessage.append(hour + ":" + minute + "\n");
    List records = NdefMessageParser.parse(ndefMessages[0]);
    final int size = records.size();
    for (int i = 0; i 

解析不同类型nfc类型的数据的方法(重点方法):

//初次判断是什么类型的NFC卡
  public static NdefMessage[] getNdefMsg(Intent intent) {
    if (intent == null)
      return null;

    //nfc卡支持的格式
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    String[] temp = tag.getTechList();
    for (String s : temp) {
      Log.i(TAG, "resolveIntent tag: " + s);
    }


    String action = intent.getAction();

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) ||
        NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
        NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
      Parcelable[] rawMessage = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
      NdefMessage[] ndefMessages;

      // 判断是哪种类型的数据 默认为NDEF格式
      if (rawMessage != null) {
        Log.i(TAG, "getNdefMsg: ndef格式 ");
        ndefMessages = new NdefMessage[rawMessage.length];
        for (int i = 0; i 

最后,附上我的demo地址,欢迎大家学习下载,有什么问题也欢迎找我讨论:

https://github.com/younger96/NFCRead

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


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
青春快乐的勇哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有