android NFC

本文介绍了Android设备上的NFC技术,包括读写器模式、P2P模式和卡模拟模式,并详细阐述了NFC标签的ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED的分发流程,以及如何筛选ACTION_TECH_DISCOVERED意图。此外,还提到了在AndroidManifest.xml中配置XML资源文件来指定支持的技术,并展示了写入NDEF格式数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近场通信(NFC)是一组短距离无线技术,通常需要4厘米或更短的距离才能启动连接。采用NFC的Android设备同时支持三种主要的操作模式:读写器模式、P2P模式、卡模拟模式。

nfc标签支持以下三种标签ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED、ACTION_NDEF_DISCOVERED分发流程如下图

这里写图片描述

筛选ACTION_TECH_DISCOVERED意图,则必须创建一个XML资源文件,该文件指定您的活动在技术列表集内支持的技术。 如果技术列表集合是标记支持的技术的子集,则可以通过调用getTechList()获得您的活动。

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

在AndroidManifest.xml文件中,在元素内的元素中指定刚才创建的资源文件,如下例所示:

<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>

以上内容来自api文档。

接下来实现以下写入ndef格式的数据。

1、先判断设备是否支持nfc功能
  mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (mNfcAdapter == null) {
            Toast.makeText(this, "对不起,您的设备不支持nfc功能", Toast.LENGTH_SHORT).show();
            return;
        }
        //创建意图
   Intent intent = new Intent(this, getClass());
        mPendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

//2重写onNewIntent方法,获取tag,并写入
  @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        if (mNfcAdapter != null) {
            Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            writeNFCTag(tag);
        }
    }

//3、打开当前页面的时候进行写操作,离开当前页面取消写操作

  @Override
    protected void onResume() {
        super.onResume();
        if (mNfcAdapter != null) {
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        }

    }


    @Override
    protected void onPause() {
        super.onPause();
        if (mNfcAdapter != null) {
            mNfcAdapter.disableForegroundDispatch(this);
        }
    }

//4、实现写入标签
  private void writeNFCTag(Tag _tag) {
        if (_tag == null) {
            Log.e(TAG, "writeNFCTag:>>>>> 没有获取到tag");
            return;
        }
        Log.e(TAG, "writeNFCTag:>>>>> 获取到tag"+_tag.toString());
        /**
         * 自动打开应用
         */
//        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{
//                NdefRecord.createApplicationRecord(mPackageName)});

        /**
         * 自动打开网页
         */

        NdefMessage ndefMessage=new NdefMessage(new NdefRecord[]{NdefRecord.createUri("http://www.baidu.com/")});
        int ndefmessage_size = ndefMessage.toByteArray().length;
        Ndef ndef = Ndef.get(_tag);
        if (ndef != null) {
            try {
                ndef.connect();
                if (!ndef.isWritable()) {
                    Log.e(TAG, "writeNFCTag:>>>>>> 标签不可写");
                    return;
                }

                if (ndef.getMaxSize() < ndefmessage_size) {
                    Log.e(TAG, "writeNFCTag:>>>>> 标签存储位置不足");
                    return;
                }


                ndef.writeNdefMessage(ndefMessage);
                Toast.makeText(this, "标签写入成功", Toast.LENGTH_SHORT).show();

            } catch (FormatException _e) {
                _e.printStackTrace();
                Log.e(TAG, "FormatException:>>>> "+ _e.getMessage());
            } catch (IOException _e) {
                Log.e(TAG, "IOException:>>>>>> "+  _e.getMessage()); ;
            }
        }

    }
### Android NFC 开发指南 #### 设备支持检查 为了确保应用程序能够在目标设备上运行,开发者应当首先确认该设备是否具备并启用了NFC功能。这一步骤可以通过`NFCManager`类来完成,在应用启动时初始化管理器实例,并利用它来进行必要的检测[^2]。 ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null || !nfcAdapter.isEnabled()) { // Handle the case where NFC is not available or disabled. } } ``` #### 处理NFC意图 当带有NFC标签的物体靠近手机时,操作系统会触发特定类型的广播消息给注册过的接收者组件。因此,为了让程序能够响应这样的事件,需要定义一个Intent Filter用于捕捉相应的动作[^1]。 ```xml <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <!-- Add more actions as needed --> </intent-filter> ``` #### 读取NFC标签信息 一旦接收到含有NFC数据的消息后,就可以解析其中的内容了。通常情况下,这些数据是以NDEF格式存储于标签之中;故而可以借助`NdefMessage`对象及其子项进行提取和解释。 ```java public void onNewIntent(Intent intent){ String action = intent.getAction(); if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)){ Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if(rawMessages != null && rawMessages.length>0){ NdefMessage message=(NdefMessage)rawMessages[0]; // Process the received data here... } } } ``` #### 发送NFC数据 除了被动地接受来自外界的数据外,Android还允许主动向其他兼容装置推送信息——即所谓的“Android Beam”。为此目的设计了一套API接口,使得分享过程变得简单快捷[^3]。 ```java setContentView(new TextView(this)); NfcAdapter adapter=NfcAdapter.getDefaultAdapter(this); adapter.setNdefPushMessageCallback( new NfcAdapter.CreateNdefMessageCallback(){ public NdefMessage createNdefMessage(NfcEvent event){ return new NdefMessage( /* Your payload */ ); } }, this); ``` #### 应用场景适配 考虑到并非所有的安卓终端都配备了这项特性,所以在manifest文件声明权限的同时也要指明此硬件不是必需品(`android:required="false"`),从而不影响那些缺少相应模块的产品正常使用软件。 ```xml <uses-feature android:name="android.hardware.nfc" android:required="false" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值