2019独角兽企业重金招聘Python工程师标准>>>

NFC,什么是NFC?想必大家都听过,就是近场通信,接下来我想给大家展示一个简单的demo, 这个demo是我在公司工作中开发的功能.希望这篇文章对大家有所帮助

目前在市场在见得比较多的电子标签有 1443 和15693 两种类型的卡片(当然还有其它类型的),这两种卡片是什么东东呢?自己百度一下,网上一大把资料有介绍的.

在我实际开发过程中就是主要接触这两种类型的卡片.我需要实现的功能是,利用带有NFC功能的手机,去读取电子标签中的数据(卡片id值这里叫UID),网上可以下载很多可以读取电子标签的app软件,但是,在我的demo里面, 是要屏蔽第三方的NFC扫描软件, 我只想用自己开发的软件去读取这些电子标签(即不使用前台调度,弹出个对话框,让我们选择使用哪个NFC软件去读取)

不多说, 直接上源码比较实在

package com.iotdc.android.app.nfc.activity;import java.io.Serializable;import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.graphics.Paint;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.nfc.tech.IsoDep;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.MifareUltralight;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.nfc.tech.NfcA;
import android.nfc.tech.NfcB;
import android.nfc.tech.NfcF;
import android.nfc.tech.NfcV;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;import com.iotdc.android.app.scanner.R;
import com.iotdc.android.app.scanresult.activity.TwoDimensionCodeActivity;
import com.iotdc.android.app.utils.NFCUtil;
import com.iotdc.android.app.utils.NFCUtil.NFCData;@SuppressLint("NewApi")
public class NFCActivity extends Activity {// private Intent intent;private TextView tvNfc;private TextView tvOpenNfC;private NfcManager manager;private NfcAdapter adapter;private PendingIntent mNfcPendingIntent;private IntentFilter[] mWriteTagFilters;private String[][] techListsArray;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_nfc);initTitile();init();initNFC();}private void init() {tvNfc = (TextView) findViewById(R.id.tv_nfc);tvOpenNfC = (TextView) findViewById(R.id.tv_open_nfc);tvOpenNfC.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);tvOpenNfC.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(NFCActivity.this,NFCGuidActivity.class);startActivity(intent);overridePendingTransition(R.anim.c_left_1_righttoleft,R.anim.c_left_2_lefttoright);}});}@SuppressLint("NewApi")public void initNFC() {manager = (NfcManager) this.getSystemService(Context.NFC_SERVICE);adapter = manager.getDefaultAdapter();if (adapter != null) {if (adapter.isEnabled()) {tvNfc.setVisibility(View.GONE);} else {tvNfc.setVisibility(View.VISIBLE);}} else {tvNfc.setVisibility(View.VISIBLE);}}@Overrideprotected void onResume() {super.onResume();System.out.println("onResume");if (adapter != null) {mNfcPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);IntentFilter ndefDetected2 = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);IntentFilter ndefDetected3 = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);try {ndefDetected.addDataType("*/*"); //} catch (MalformedMimeTypeException e) {throw new RuntimeException("fail", e);}techListsArray = new String[][] { new String[] {NfcA.class.getName(), NfcV.class.getName(),Ndef.class.getName(), NdefFormatable.class.getName(),MifareClassic.class.getName(),MifareUltralight.class.getName(), IsoDep.class.getName(),NfcB.class.getName(), NfcF.class.getName() } };mWriteTagFilters = new IntentFilter[] { ndefDetected,ndefDetected2, ndefDetected3 };adapter.enableForegroundDispatch(this, mNfcPendingIntent,mWriteTagFilters, techListsArray);Intent intent = this.getIntent();resolveIntent(intent); // 这两行代码一定要写}}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);System.out.println("onNewIntent");resolveIntent(intent);}private void resolveIntent(Intent intent) {if (adapter != null) {NFCData nd = NFCUtil.getNFCIntentData(intent);if (nd != null) {String uid = nd.getUid();if (uid != null && !"".equals(uid)) {intent = new Intent(NFCActivity.this,ResultActivity.class);intent.putExtra("nfcData", (Serializable) nd);startActivity(intent);overridePendingTransition(R.anim.c_left_1_righttoleft,R.anim.c_left_2_lefttoright);}}}}@Overrideprotected void onPause() {super.onPause();if (adapter != null) {adapter.disableForegroundDispatch(this);}}public void initTitile() {TextView tv_title = (TextView) findViewById(R.id.tv_title);tv_title.setText(R.string.scan_nfc_title);ImageView iv_left = (ImageView) findViewById(R.id.iv_left);iv_left.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {finish();overridePendingTransition(R.anim.c_right_1_lefttoright,R.anim.c_right_2_righttoleft);}});ImageView iv_right = (ImageView) findViewById(R.id.iv_right);iv_right.setVisibility(View.INVISIBLE);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {this.finish();overridePendingTransition(R.anim.c_right_1_lefttoright,R.anim.c_right_2_righttoleft);}return super.onKeyDown(keyCode, event);}
}

下面是activity_nfc的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><include layout="@layout/title" /><LinearLayoutandroid:id="@+id/no_info_frag"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ImageViewandroid:id="@+id/noRecord"android:layout_width="100dp"android:layout_height="100dp"android:layout_gravity="center"android:layout_marginTop="127dp"android:src="@drawable/nfc_bitmap" /><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:text="@string/NFCText"android:textColor="@color/golden"android:layout_gravity="center"android:gravity="center"android:textSize="15sp" /><TextViewandroid:id="@+id/tv_nfc"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="50dp"android:layout_marginRight="50dp"android:text="@string/noNFCText"android:textColor="@color/red"android:layout_gravity="center"android:gravity="center"android:textSize="15sp" /><TextViewandroid:id="@+id/tv_open_nfc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:text="@string/openNFCText"android:textColor="#004190"android:layout_gravity="center"android:textSize="18sp" /></LinearLayout></LinearLayout>

使用一个ResultActivity来显示NFC读取到电子标签的结果,用一个TextView 显示就是了, 大家都懂的

package com.iotdc.android.app.nfc.activity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;import com.iotdc.android.app.config.SystemConfig;
import com.iotdc.android.app.scanner.R;public class NFCResultActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_nfc_result);initTitleBar();TextView tvRead = (TextView) findViewById(R.id.tv_nfc_read);Intent data = this.getIntent();String uid = data.getStringExtra("nfcResult");String msg = data.getStringExtra("msg");SystemConfig.error(msg, this);tvRead.setText(uid);}private void initTitleBar(){TextView tv_title = (TextView) findViewById(R.id.tv_title);tv_title.setText(R.string.scan_nfc_title_result);ImageView iv_left = (ImageView) findViewById(R.id.iv_left);iv_left.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {finish();overridePendingTransition(R.anim.c_right_1_lefttoright,R.anim.c_right_2_righttoleft);}});ImageView iv_right = (ImageView) findViewById(R.id.iv_right);iv_right.setVisibility(View.INVISIBLE);}
}

其中NFC读取数据的方法我写在了一个工具类中,叫NFCUtil

package com.iotdc.android.app.utils;import java.io.Serializable;import android.annotation.SuppressLint;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;import com.iotdc.android.app.nfc.TagBlockStream;public class NFCUtil {@SuppressLint("NewApi")public static NFCData getNFCIntentData(Intent intent) {NFCData nd = new NFCData();String uid = "";String data = "";String action = intent.getAction(); // 判断nfc的类型,一共有三种if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);TagBlockStream bs = TagBlockStream.getInstance(tagFromIntent);byte[] blockContent = null;// HonestTag hTag = null;uid = HexUtility.byteArrayToString(tagFromIntent.getId());if (bs != null) {try {bs.connect();blockContent = bs.readBlock(0);} catch (Exception e) {e.printStackTrace();} finally {try {bs.close();} catch (Exception e) {e.printStackTrace();}}}}nd.setUid(uid); // 03190B0000014BE0return nd;}public static class NFCData implements Serializable {/*** 标签UID 值*/private String uid;public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}}
}

到上面的话,逻辑代码就已经完成了, 注意, 没有完, NFC 一定要手机支持,并且要在Manifest.xml文件中进行权限配置

<uses-permission android:name="android.permission.NFC" />

还要在对activity 进行过滤

<activityandroid:name="com.iotdc.android.app.nfc.activity.NFCActivity"android:screenOrientation="portrait" ><!-- 这 一句一定是要的--><intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /></intent-filter>
</activity>

到这里, 所有的工作就都完成了, 对NFC 我也不是太了解,只是在工作中用到了, 目前在公司的话, 还没有接触过手机与手机之间的通信, 希望大神能够指导,共同进步

转载于:https://my.oschina.net/u/1018305/blog/385173

Android NFC读取电子标签相关推荐

  1. android nfc 原始读取,Android NFC读取数据

    1.添加相应的权限和gradle引用 android:name="android.hardware.nfc" android:required="true"/& ...

  2. android NFC读取UID

    1.在清单文件中添加所需要的权限 <uses-sdk android:minSdkVersion="8" /> <uses-permission android: ...

  3. Android NFC 读取IC卡的简单封装

    一.NFC简介 NFC是一种近距离无线通信技术,一种非接触式的识别和互联技术. NFC由非接触式射频识别标准(RFID)及互联互通技术演变而成,通过在芯片上集成了感应式读卡器.感应式卡片和点对点三种功 ...

  4. android+nfc+公交卡,Android NFC 读取公交卡信息Demo

    [实例简介] 通过NFC的读模式,读取公交卡的余额和交易记录. 支持深圳通.羊城通.北京卡.八达通.武汉通等等 [实例截图] [核心代码] 54db6f91-a3f7-4259-8833-638611 ...

  5. android nfc读取公交卡信息_手机NFC可以复制小区用的门禁卡吗?

    很多带有NFC功能的手机和手环,可以用来代替小区门禁卡.公司门禁,以及各类一卡通.(NFC是一种非接触式通讯技术,工作的理论距离是0~10cm)以前出门必备手机.钱包.钥匙三件套,自移动支付出现.使用 ...

  6. android nfc读取公交卡信息_苹果将开放NFC功能,未来iPhone可录公交卡 房卡 门禁卡了...

    责任编辑:XC丨插图来自于网络  苹果NFC入口将开放  在今年十月份开始,欧盟就对苹果手机的 NFC 功能进行了 反垄断市场 调查.认为iPhone具有NFC功能,但是苹果的NFC功能仅限自己的 A ...

  7. android nfc读取公交卡信息_荣耀手机NFC升级了:公交、门禁、支付、饭卡、加密卡还能写卡...

    2019年双十一期间,入手了荣耀magic2手机,其实去年用过一次,今年换了多次还是特别喜欢,主要是麒麟980旗舰CPU,全面滑屏特有面子. 入手的第一时间,自己就启用了手机的钱包功能,手机钱包除了小 ...

  8. Android中读取NFC标签卡中的ID

    场景 APP中读取NFC卡中的标签ID,作为用户的唯一标识进行登录验证. 首先需要确保手机支持NFC功能.其次具备一张NFC卡片. 读取id就是利用的读卡器模式,当把卡片靠近手机的NFC天线的时候,N ...

  9. 基于Android NFC传感器读取身份证信息demo

    摘要:通过导入开发包sdk开发基几Android NFC设备读取身份证信息 1. 开发条件: 1)鱼住往来科技的身份验证sdk :下载地址:https://www.yzfuture.cn/views/ ...

最新文章

  1. dubbo开发环境和生产环境搭建
  2. hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
  3. jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
  4. oracle 索引回表,oracle 索引简单总结
  5. python的property用法_在python中property怎样使用-百度经验
  6. Kalman Filter : 理解卡尔曼滤波的三重境界
  7. 重构28-Rename boolean method(重命名布尔方法)
  8. Mem Reduct 内存自动清理工具
  9. php+uniapp(微信小程序版)实现电子签名及合同生成
  10. Windows 取证之ShellBags
  11. 流媒体-RTP/RTCP
  12. vue3.x 使用jsplumb进行拖拽连线
  13. java中 Excel文件解析及超大Excel文件读写
  14. 服务器IMM2实战介绍
  15. 3-10 Pandas的数据规整
  16. 局域网计算机配置扫描系统,fly42局域网计算机配置检测系统
  17. TYPE-C手机如何同时充电不影响传输USB2.0数据功能
  18. scara机器人dh参数表_工业机器人九大选型参数
  19. 计算机快捷键及word的几个常用技巧
  20. 数据结构学习笔记-郝斌

热门文章

  1. 高级同步器:可重用的同步屏障Phaser
  2. django 函数装饰器 变为 类装饰器
  3. Python全栈工程师(异常(基础))
  4. 洛谷——P1119 灾后重建
  5. Day03 javascript详解
  6. (转)iOS里面Frameworks介绍
  7. (转载)Linux编程获取本机IP地址的三种方法
  8. C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)
  9. [导入]ASP.NET MVC框架开发系列课程(2):一个简单的ASP.NET MVC应用程序.zip(13.70 MB)...
  10. andorid程序UI线程下开启子线程闪退错误解决