安卓nfc通讯

1 介绍nfc

Android NFC (Near Field Communication) 通信是一种短距离无线通信技术,可以在设备之间进行数据交换。以下是 Android NFC 通信的主要方面和使用方法:

1. NFC 基础

- NFC 工作距离通常在 4cm 以内
- 支持三种模式:读/写模式、P2P 模式、卡模拟模式

2. 在 AndroidManifest.xml 中声明 NFC 权限

```xml
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
```

3. 检查 NFC 可用性

```java
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
    // 设备不支持 NFC
} else if (!nfcAdapter.isEnabled()) {
    // NFC 未启用
} else {
    // NFC 可用
}
```

4. 读取 NFC 标签

在 Activity 中实现:

```java
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i++) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            // 处理 NDEF 消息
            processNdefMessages(messages);
        }
    }
}

private void processNdefMessages(NdefMessage[] messages) {
    for (NdefMessage message : messages) {
        for (NdefRecord record : message.getRecords()) {
            byte[] payload = record.getPayload();
            String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
            int languageCodeLength = payload[0] & 0063;
            String text = new String(payload, languageCodeLength + 1, 
                           payload.length - languageCodeLength - 1, textEncoding);
            // 使用读取的文本
        }
    }
}
```

5. 写入 NFC 标签

```java
private void writeNfcTag(Tag tag, String data) {
    NdefRecord record = NdefRecord.createTextRecord("en", data);
    NdefMessage message = new NdefMessage(new NdefRecord[]{record});
    
    try {
        Ndef ndef = Ndef.get(tag);
        if (ndef != null) {
            ndef.connect();
            ndef.writeNdefMessage(message);
            ndef.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
```

6. Android Beam (P2P 模式)

注意:Android 10 及以上版本已移除 Android Beam。

```java
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        String text = "Hello, NFC!";
        NdefRecord record = NdefRecord.createTextRecord("en", text);
        return new NdefMessage(new NdefRecord[]{record});
    }
}, this);
```

7. 前台调度系统

为了确保你的应用能够处理 NFC 标签,可以使用前台调度系统:

```java
@Override
protected void onResume() {
    super.onResume();
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    IntentFilter[] filters = new IntentFilter[]{tagDetected};
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
        new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, null);
}

@Override
protected void onPause() {
    super.onPause();
    nfcAdapter.disableForegroundDispatch(this);
}
```

8. 高级功能

- HCE (Host-based Card Emulation): 允许 Android 设备模拟 NFC 卡
- Reader Mode: 专门用于读取 NFC 标签的模式

9. 安全考虑

- 验证从 NFC 标签读取的数据
- 在写入敏感信息时考虑加密
- 注意 NFC 通信的物理安全性(短距离可能被窃听)

10. 调试技巧

- 使用 NFC 标签应用来模拟 NFC 标签
- 利用 Android Studio 的调试工具

使用 NFC 时,记住要考虑用户体验,比如提供清晰的指导,让用户知道何时将设备靠近 NFC 标签。同时,要处理可能出现的错误,如 NFC 不可用、标签读取失败等情况。

通过这些方法,你可以在 Android 应用中实现各种 NFC 功能,如数据传输、标签读写、设备配对等。
 

2.应该注意的问题

在使用 Android NFC 通信时,应该注意以下几个关键问题:

1. 兼容性问题

- 设备支持:并非所有 Android 设备都支持 NFC。
- 版本差异:不同 Android 版本的 NFC API 可能有差异。
- 标签类型:确保你的应用能处理不同类型的 NFC 标签。

解决方案:
- 在应用启动时检查 NFC 可用性。
- 针对不同 Android 版本进行适配。
- 支持多种常见的 NFC 标签类型。

2. 用户体验

- 触发不稳定:NFC 感应可能不够灵敏或不稳定。
- 操作反馈:用户可能不清楚 NFC 操作是否成功。

解决方案:
- 提供清晰的视觉和听觉反馈。
- 给予用户明确的操作指导。
- 实现重试机制。

3. 安全性

- 数据安全:NFC 通信可能被窃听。
- 恶意标签:可能存在恶意 NFC 标签。

解决方案:
- 对敏感数据进行加密。
- 实现数据验证机制。
- 警惕并处理潜在的恶意数据。

4. 性能问题

- 读写速度:NFC 数据传输速度较慢。
- 电池消耗:频繁使用 NFC 可能增加电池消耗。

解决方案:
- 优化数据结构,减少传输量。
- 合理控制 NFC 功能的使用频率。

5. 错误处理

- 连接中断:NFC 连接可能突然中断。
- 读写失败:标签读写可能因各种原因失败。

解决方案:
- 实现健壮的错误处理机制。
- 提供用户友好的错误提示。
- 实现自动重试逻辑。

6. 权限管理

- 运行时权限:Android 6.0 以上需要动态申请权限。
- NFC 开关:用户可能随时关闭 NFC 功能。

解决方案:
- 正确实现运行时权限请求。
- 动态检查 NFC 状态,并提示用户开启。

7. 多任务环境

- 前台分发:确保你的应用能在前台时处理 NFC 事件。
- 后台限制:Android 系统可能限制后台应用的 NFC 操作。

解决方案:
- 正确实现前台分发系统。
- 考虑使用服务来处理长时间的 NFC 操作。

8. 测试挑战

- 硬件依赖:NFC 功能测试依赖于实际硬件。
- 场景复现:某些 NFC 交互场景可能难以在测试环境中复现。

解决方案:
- 使用模拟器和实机结合的测试策略。
- 创建模拟 NFC 标签的测试工具。

9. 国际化考虑

- 标准差异:不同国家/地区可能有不同的 NFC 使用标准。
- 语言支持:NFC 标签内容可能需要多语言支持。

解决方案:
- 了解并遵守目标市场的 NFC 标准。
- 实现多语言支持,特别是对标签内容。

10. 电磁干扰

- 其他设备干扰:某些电子设备可能干扰 NFC 信号。
- 金属物体:金属物体可能影响 NFC 通信。

解决方案:
- 提供使用指导,避开可能的干扰源。
- 实现重试机制,增强通信稳定性。

通过注意这些问题并采取相应的解决方案,你可以大大提高 Android NFC 应用的质量和用户体验。记住,NFC 技术虽然强大,但也有其局限性,合理设计和充分测试是确保应用成功的关键。
 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Android 实现 NFC 通讯的基本代码: 1. 在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.NFC" /> ``` 2. 在 Activity 中声明一个 NfcAdapter 对象: ```java private NfcAdapter mNfcAdapter; ``` 3. 在 Activity 的 onCreate() 方法中初始化 NfcAdapter 对象: ```java mNfcAdapter = NfcAdapter.getDefaultAdapter(this); ``` 4. 在 Activity 的 onResume() 方法中启用前台调度(Foreground Dispatch),以便在应用程序在前台运行时处理 NFC 意图(Intent): ```java PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter[] intentFiltersArray = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED), new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) }; String[][] techListsArray = new String[][] { new String[] { NfcF.class.getName() }, new String[] { IsoDep.class.getName() }, new String[] { NfcA.class.getName() }, new String[] { NfcB.class.getName() }, new String[] { NfcV.class.getName() }, new String[] { MifareClassic.class.getName() }, new String[] { MifareUltralight.class.getName() } }; mNfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); ``` 5. 在 Activity 的 onPause() 方法中禁用前台调度: ```java mNfcAdapter.disableForegroundDispatch(this); ``` 6. 在 Activity 中重写 onNewIntent() 方法,以处理 NFC 意图: ```java @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { // 处理 NDEF 意图 } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { // 处理 TECH 意图 } else if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { // 处理 TAG 意图 } } ``` 这就是 Android 实现 NFC 通讯的基本代码。您可以在 onNewIntent() 方法中根据需要处理不同类型的 NFC 意图,并执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值