android NFC的读写

一、NFC知识

1、NFC是什么?

NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术,它提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务 。
2、NFC的技术优势?
与蓝牙相比:NFC操作简单,配对迅速
与RFID相比:NFC适用范围广泛、可读可写,能直接集成在手机中
与红外线相比:数据传输较快、安全性高、能耗低
与二维码相比:识别迅速、信息类型多样
将来与移动支付相结合,势必简化支付的购买流程,重塑消费者的购物模式。

二、android下读写NFC

1、在AndroidManifest.xml中申明NFC权限
<uses-permission android:name="android.permission.NFC" /> 
<!-- 这项不一定需要,可以在android market中显示有NFC硬件 -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />
2、NFC TAG的发布系统

当android设备扫描到一个NFC标签时,会自动寻找最适合的activity来处理这个TAG,如果有多个activity满足条件的话,会让用户选择使用哪个activity来处理,可理解为简单的事件响应与时间处理。
activity使用intentfilter来监听扫描到NFC标签事件。

IntentFilter ifilters = new IntentFilter();
ifilters.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);//NDEF
ifilters.addAction(NfcAdapter.ACTION_TAG_DISCOVERED);//TAG
ifilters.addAction(NfcAdapter.ACTION_TECH_DISCOVERED);//TECH
3、检测到标签后在Activity中的处理流程

3.1 在onCreate()中获取NfcAdapter对象

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);

3.2 在onNewIntent()中获取Tag对象或者NdefMessage信息

//获取Tag对象
Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);
//获取NdefMessage信息
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

3.3 也可以通过Tag创建Ndef对象等,以实现标签的属性和I/O操作。

Ndef ndef = Ndef.get(tag);
4、NDEF格式标签的读取流程

4.1 在onCreate()中获取NfcAdapter对象
4.2 在onNewIntent()中判断是否为NDEF格式标签(ACTION_NDEF_DISCOVERED),若是则获取NdefMessage信息;(需要强制转换成NdefMessage对象)

Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

4.3 对NdefMessage对象进行解析,获取相关的文本信息或Uri等

5、NDEF格式标签的写入流程

5.1 在onCreate()中获取NfcAdapter对象
5.2 在onNewIntent()中获取Tag对象

Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);

5.3 通过Tag创建Ndef对象

Ndef ndef = Ndef.get(tag);

5.4 将文本等数据封装成NdefMessage
5.5 判断是否为NDEF格式标签
若是NDEF格式:
(1)允许进行标签操作:ndef.connect();
(2)调用ndef.writeNdefMessage(NdefMessage)方法写入。
若非NDEF格式:
(1)NdefFromatable format = NdefFromatable.get();
(2)允许进行标签操作:format.connect();
(3)调用format.format(NdefMessage)方法写入。

三、测试代码

import java.io.UnsupportedEncodingException;

import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
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.os.Parcelable;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

/**
 * 注:谷歌推荐的数据格式为NDEF,所以本次DEMO的读写都是采用该格式.
 */
public class MainActivity extends Activity {
   
    private TextView ifo_NFC;
    private NfcAdapter nfcAdapter;
    private String readResult = "";
    private PendingIntent pendingIntent;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private boolean isFirst = true;
    private Button toWBtn;
    private IntentFilter ndef;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android NFC技术中的ISO-DEP协议(ISO 14443-4)提供了一种在NFC标签和Android设备之间进行读写通信的方式。以下是一个简单的ISO-DEP读写示例,您可以参考其中的代码实现。 首先,您需要在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.NFC"/> ``` 然后,在您的Activity类中,实现以下代码: ```java private NfcAdapter mAdapter; private PendingIntent mPendingIntent; private IsoDep mIsoDep; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdapter = NfcAdapter.getDefaultAdapter(this); // 创建一个PendingIntent对象,用于在检测到标签时启动Activity mPendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); } @Override protected void onResume() { super.onResume(); // 检测NFC是否可用 if (mAdapter == null) { Toast.makeText(this, "NFC不可用", Toast.LENGTH_LONG).show(); return; } // 当前Activity在前台时,启动前台调度系统以检测标签 mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); } @Override protected void onPause() { super.onPause(); // 当前Activity不再处于前台时,停止前台调度系统 mAdapter.disableForegroundDispatch(this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 检测到标签时,获取IsoDep对象 if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); mIsoDep = IsoDep.get(tag); } // 如果获取到IsoDep对象,可以进行读写操作 if (mIsoDep != null) { try { mIsoDep.connect(); byte[] data = mIsoDep.transceive(new byte[] {0x00, 0x01, 0x02, 0x03}); // 发送一个命令并接收响应 Log.d("ISO-DEP", "读取到的数据:" + Arrays.toString(data)); mIsoDep.close(); } catch (IOException e) { Log.e("ISO-DEP", "连接失败", e); } } } ``` 在这个示例中,我们使用了Android的前台调度系统来检测标签,并通过IsoDep对象进行读写操作。在onNewIntent()方法中,我们获取到IsoDep对象后,可以使用connect()方法连接标签,使用transceive()方法进行数据交换,最后使用close()方法关闭连接。 以上是一个简单的ISO-DEP读写示例,您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值