源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

android nfc常用标签读取总结

  • 时间:2021-10-03 07:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android nfc常用标签读取总结
有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式。废话到此为止,下面开始正文。 NFC(Near Field Communication,近场通信)是一种数据传输技术。与Wi-Fi、蓝牙、红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4厘米。但是NFC传输速度要比红外快。目前NFC已经出现了一些应用,例如电子标签识别、刷手机、点对点付款、身份识别、信息记录等,本篇文章的目的是为大家揭开NFC标签的面纱。 [img]http://files.jb51.net/file_images/article/201612/2016121510190113.png[/img] [img]http://files.jb51.net/file_images/article/201612/2016121510190114.jpg[/img] 下面我们先从NFC的工作模式开始阐述NFC,开发NFC必先了解NFC。 [b]1.NFC的工作模式[/b] NFC支持如下3种工作模式:读卡器模式(Reader/writer mode)、仿真卡模式(Card Emulation Mode)、点对点模式(P2P mode)。 下来分别看一下这三种模式: [b](1)读卡器模式[/b] 数据在NFC芯片中,可以简单理解成“刷标签”。本质上就是通过支持NFC的手机或其它电子设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的。当支持NFC的外设向NFC读写数据时,它会发送某种磁场,而这个磁场会自动的向NFC标签供电。 [b](2)仿真卡模式[/b] 数据在支持NFC的手机或其它电子设备中,可以简单理解成“刷手机”。本质上就是将支持NFC的手机或其它电子设备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC的外设中 。 在使用时还需要一个NFC射频器(相当于刷卡器)。将手机靠近NFC射频器,手机就会接收到NFC射频器发过来的信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连接的电脑,并进行相应的处理(如电子转帐、开门等操作)。 [b](3)点对点模式[/b] 该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有“刷”的感觉了。其有效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使用Android4.2,NFC会直接利用蓝牙传输。这种技术被称为Android Beam。所以使用Android Beam传输数据的两部设备不再限于4厘米之内。 点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系人。因此,通过NFC,多个设备如数字相机,计算机,手机之间,都可以快速连接,并交换资料或者服务。 下面看一下NFC、蓝牙和红外之间的差异:
对比项 NFC 蓝牙 红外
网络类型 点对点 单点对多点 点对点
有效距离 <=0.1m <=10m,最新的蓝牙4.0有效距离可达100m 一般在1m以内,热技术连接,不稳定
传输速度 最大424kbps 最大24Mbps 慢速115.2kbps,快速4Mbps
建立时间 <0.1s 6s 0.5s
安全性 安全,硬件实现 安全,软件实现 不安全,使用IRFM时除外
通信模式 主动-主动/被动 主动-主动 主动-主动
成本
[b]2.Android对NFC的支持[/b] 不同的NFC标签之间差异很大,有的只支持简单的读写操作,有时还会采用支持一次性写入的芯片,将NFC标签设计成只读的。当然,也存在一些复杂的NFC标签,例如,有一些NFC标签可以通过硬件加密的方式限制对某一区域的访问。还有一些标签自带操作环境,允许NFC设备与这些标签进行更复杂的交互。这些标签中的数据也会采用不同的格式。但Android SDK API主要支持NFC论坛标准(Forum Standard),这种标准被称为NDEF(NFC Data Exchange Format,NFC数据交换格式)。 NDEF格式其实就类似于硬盘的NTFS,[b]下面我们看一下NDEF数据:[/b] [b](1)NDEF数据的操作[/b] Android SDK API支持如下3种NDEF数据的操作: 1)从NFC标签读取NDEF格式的数据。 2)向NFC标签写入NDEF格式的数据。 3)通过Android Beam技术将NDEF数据发送到另一部NFC设备。 [b]用于描述NDEF格式数据的两个类:[/b] 1)NdefMessage:描述NDEF格式的信息,实际上我们写入NFC标签的就是NdefMessage对象。 2)NdefRecord:描述NDEF信息的一个信息段,一个NdefMessage可能包含一个或者多个NdefRecord。 NdefMessage和NdefRecord是Android NFC技术的核心类,无论读写NDEF格式的NFC标签,还是通过Android Beam技术传递Ndef格式的数据,都需要这两个类。 [b](2)非NDEF数据的操作[/b] 对于某些特殊需求,可能要存任意的数据,对于这些数据,我们就需要自定义格式。这些数据格式实际上就是普通的字节流,至于字节流中的数据代表什么,就由开发人员自己定义了。 [b](3)编写NFC程序的基本步骤[/b] 1)设置权限,限制Android版本、安装的设备:
<uses-sdk android:minSdkVersion="14"/>
<uses-permission android:name="android.permission.NFC" />
<!-- 要求当前设备必须要有NFC芯片 -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />
2)定义可接收Tag的Activity Activity清单需要配置一下launchMode属性:
<activity
  android:name=".TagTextActivity"
  android:launchMode="singleTop"/>
而Activity中,我们也抽取了一个通用的BaseNfcActivity,如下(后面的Activity实现都继承于BaseNfcActivity):
/**
 * 1.子类需要在onCreate方法中做Activity初始化。
 * 2.子类需要在onNewIntent方法中进行NFC标签相关操作。
 *  当launchMode设置为singleTop时,第一次运行调用onCreate方法,
 *  第二次运行将不会创建新的Activity实例,将调用onNewIntent方法
 *  所以我们获取intent传递过来的Tag数据操作放在onNewIntent方法中执行
 *  如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())
 *  只要NFC标签靠近就执行
 */
public class BaseNfcActivity extends AppCompatActivity {
  private NfcAdapter mNfcAdapter;
  private PendingIntent mPendingIntent;
  /**
   * 启动Activity,界面可见时
   */
  @Override
  protected void onStart() {
    super.onStart();
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    //一旦截获NFC消息,就会通过PendingIntent调用窗口
    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
  }
  /**
   * 获得焦点,按钮可以点击
   */
  @Override
  public void onResume() {
    super.onResume();
    //设置处理优于所有其他NFC的处理
    if (mNfcAdapter != null)
      mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
  }
  /**
   * 暂停Activity,界面获取焦点,按钮可以点击
   */
  @Override
  public void onPause() {
    super.onPause();
    //恢复默认状态
    if (mNfcAdapter != null)
      mNfcAdapter.disableForegroundDispatch(this);
  }
}

注意:通常来说,所有处理NFC的Activity都要设置launchMode属性为singleTop或者singleTask,保证了无论NFC标签靠近手机多少次,Activity实例只有一个。 接下来看几个具体的NFC标签应用实例,通过情景学习快速掌握NFC技术: [b]3.两个NFC标签的简单实例[/b] 1.利用NFC标签让Android自动运行程序 场景是这样的:现将应用程序的包写到NFC程序上,然后我们将NFC标签靠近Android手机,手机就会自动运行包所对应的程序,这个是NFC比较基本的一个应用。下面以贴近标签自动运行Android自带的“短信”为例。 向NFC标签写入数据一般分为三步: 1)获取Tag对象
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
2)判断NFC标签的数据类型(通过Ndef.get方法)
Ndef ndef = Ndef.get(tag);
3)写入数据
ndef.writeNdefMessage(ndefMessage);
详细实现代码如下:
public class RunAppActivity extends BaseNfcActivity{
  private String mPackageName = "com.android.mms";//短信
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  @Override
  public void onNewIntent(Intent intent) {
    if (mPackageName == null)
      return;
    //1.获取Tag对象
    Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    writeNFCTag(detectedTag);
  }
  /**
   * 往标签写数据的方法
   *
   * @param tag
   */
  public void writeNFCTag(Tag tag) {
    if (tag == null) {
      return;
    }
    NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
        .createApplicationRecord(mPackageName)});
    //转换成字节获得大小
    int size = ndefMessage.toByteArray().length;
    try {
      //2.判断NFC标签的数据类型(通过Ndef.get方法)
      Ndef ndef = Ndef.get(tag);
      //判断是否为NDEF标签
      if (ndef != null) {
        ndef.connect();
        //判断是否支持可写
        if (!ndef.isWritable()) {
          return;
        }
        //判断标签的容量是否够用
        if (ndef.getMaxSize() < size) {
          return;
        }
        //3.写入数据
        ndef.writeNdefMessage(ndefMessage);
        Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
      } else { //当我们买回来的NFC标签是没有格式化的,或者没有分区的执行此步
        //Ndef格式类
        NdefFormatable format = NdefFormatable.get(tag);
        //判断是否获得了NdefFormatable对象,有一些标签是只读的或者不允许格式化的
        if (format != null) {
          //连接
          format.connect();
          //格式化并将信息写入标签
          format.format(ndefMessage);
          Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
        } else {
          Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
        }
      }
    } catch (Exception e) {
    }
  }
}

注意:设置 RunAppActivity 的 launchMode 属性为 singleTop。 现在看一下效果图: [img]http://files.jb51.net/file_images/article/201612/2016121510190115.png[/img] 将NFC标签贴近手机背面,自动写入数据,此时退出所有程序,返回桌面,然后再将NFC标签贴近手机背面,将会看到自动打开了“短信”。 [img]http://files.jb51.net/file_images/article/201612/2016121510190116.png[/img] 下来再看一个有趣的例子: 2.利用NFC标签让Android自动打开网页 如何让NFC标签贴近手机,手机可以自动打开一个网页呢? 首先我们创建一个NdefRecord,Android已经为我们提供好了这样的方法:
//直接接受一个Uri
public NdefRecord createUri(String uriString); 
//接受一个Uri的对象
public NdefRecord createUri(Uri uri); 
实现代码对比“3.利用NFC标签让Android自动运行程序”部分只是修改了writeNFCTag方法中
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
    .createApplicationRecord(mPackageName)});
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
    .createUri(Uri.parse(
      
    
    
      8
      0x08
      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部