当前位置:   article > 正文

Android实现NFC读写_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和添加相应的权限;

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

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

  1. <activity android:name=".Activity.Main.NFCActivity">
  2. <intent-filter>
  3. <action android:name="android.nfc.action.TAG_DISCOVERED" />
  4. <category android:name="android.intent.category.DEFAULT" />
  5. <data android:mimeType="*/*" />
  6. </intent-filter>
  7. </activity>

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

  1. public class NfcUtils {
  2. //nfc
  3. public static NfcAdapter mNfcAdapter;
  4. public static IntentFilter[] mIntentFilter = null;
  5. public static PendingIntent mPendingIntent = null;
  6. public static String[][] mTechList = null;
  7. /**
  8. * 构造函数,用于初始化nfc
  9. */
  10. public NfcUtils(Activity activity) {
  11. mNfcAdapter = NfcCheck(activity);
  12. NfcInit(activity);
  13. }
  14. /**
  15. * 检查NFC是否打开
  16. */
  17. public static NfcAdapter NfcCheck(Activity activity) {
  18. NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
  19. if (mNfcAdapter == null) {
  20. return null;
  21. } else {
  22. if (!mNfcAdapter.isEnabled()) {
  23. Intent setNfc = new Intent(Settings.ACTION_NFC_SETTINGS);
  24. activity.startActivity(setNfc);
  25. }
  26. }
  27. return mNfcAdapter;
  28. }
  29. /**
  30. * 初始化nfc设置
  31. */
  32. public static void NfcInit(Activity activity) {
  33. mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
  34. IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
  35. IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
  36. try {
  37. filter.addDataType("*/*");
  38. } catch (IntentFilter.MalformedMimeTypeException e) {
  39. e.printStackTrace();
  40. }
  41. mIntentFilter = new IntentFilter[]{filter, filter2};
  42. mTechList = null;
  43. }
  44. /**
  45. * 读取NFC的数据
  46. */
  47. public static String readNFCFromTag(Intent intent) throws UnsupportedEncodingException {
  48. Parcelable[] rawArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
  49. if (rawArray != null) {
  50. NdefMessage mNdefMsg = (NdefMessage) rawArray[0];
  51. NdefRecord mNdefRecord = mNdefMsg.getRecords()[0];
  52. if (mNdefRecord != null) {
  53. String readResult = new String(mNdefRecord.getPayload(), "UTF-8");
  54. return readResult;
  55. }
  56. }
  57. return "";
  58. }
  59. /**
  60. * 往nfc写入数据
  61. */
  62. public static void writeNFCToTag(String data, Intent intent) throws IOException, FormatException {
  63. Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  64. Ndef ndef = Ndef.get(tag);
  65. ndef.connect();
  66. NdefRecord ndefRecord = NdefRecord.createTextRecord(null, data);
  67. NdefRecord[] records = {ndefRecord};
  68. NdefMessage ndefMessage = new NdefMessage(records);
  69. ndef.writeNdefMessage(ndefMessage);
  70. }
  71. /**
  72. * 读取nfcID
  73. */
  74. public static String readNFCId(Intent intent) throws UnsupportedEncodingException {
  75. Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  76. String id = ByteArrayToHexString(tag.getId());
  77. return id;
  78. }
  79. /**
  80. * 将字节数组转换为字符串
  81. */
  82. private static String ByteArrayToHexString(byte[] inarray) {
  83. int i, j, in;
  84. String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
  85. String out = "";
  86. for (j = 0; j < inarray.length; ++j) {
  87. in = (int) inarray[j] & 0xff;
  88. i = (in >> 4) & 0x0f;
  89. out += hex[i];
  90. i = in & 0x0f;
  91. out += hex[i];
  92. }
  93. return out;
  94. }
  95. }

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

  1. @Override
  2. public void initData() {
  3. //nfc初始化设置
  4. NfcUtils nfcUtils = new NfcUtils(this);
  5. }
  6. @Override
  7. protected void onResume() {
  8. super.onResume();
  9. //开启前台调度系统
  10. NfcUtils.mNfcAdapter.enableForegroundDispatch(this, NfcUtils.mPendingIntent, NfcUtils.mIntentFilter, NfcUtils.mTechList);
  11. }
  12. @Override
  13. protected void onPause() {
  14. super.onPause();
  15. //关闭前台调度系统
  16. NfcUtils.mNfcAdapter.disableForegroundDispatch(this);
  17. }
  18. @Override
  19. protected void onNewIntent(Intent intent) {
  20. super.onNewIntent(intent);
  21. //当该Activity接收到NFC标签时,运行该方法
  22. //调用工具方法,读取NFC数据
  23. String str = NfcUtils.rendFromTag(intent);
  24. }

5、判断手机是否支持NFC

  1. PackageManager packageManager = this.getPackageManager();
  2. boolean b1 = packageManager.hasSystemFeature(PackageManager.FEATURE_NFC);
  3. Toast.makeText(context, "是否支持nfc:" + b1, 1).show();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/314791
推荐阅读
相关标签
  

闽ICP备14008679号