千家信息网

android如何实现NFC读写功能

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,小编给大家分享一下android如何实现NFC读写功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、NFC是什么?近距
千家信息网最后更新 2025年02月08日android如何实现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 TS 102 190标准。NFC采用主动和被动两种读取模式。

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

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

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

2. 点对点模式(P2Pmode):

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

3.卡模式(Cardemulation):

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

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

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

          

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

                                            

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);  }

以上是"android如何实现NFC读写功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0