You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何为EditText输入内容追加固定字符串写入NFC标签?

嘿,从PHP转Android确实得适应下不同的开发思路,我来帮你搞定这个NFC标签写入的需求!咱们一步步来,保证你能快速上手:

1. 先搞定界面布局

首先在res/layout/activity_main.xml里添加输入框和按钮,用LinearLayout就能简单实现:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 用户输入内容的EditText -->
    <EditText
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入要追加的内容" />

    <!-- 执行写入的Button -->
    <Button
        android:id="@+id/btn_write"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="写入NFC标签"
        android:layout_marginTop="16dp" />

</LinearLayout>
2. 配置NFC权限和声明

打开AndroidManifest.xml,添加必要的权限和NFC相关配置,不然APP没法访问NFC功能:

<!-- NFC权限 -->
<uses-permission android:name="android.permission.NFC" />
<!-- 声明APP仅支持有NFC的设备(可选,若要兼容无NFC设备可去掉) -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />

<application ...>
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <!-- 添加NFC标签检测的过滤,当NFC标签靠近时会触发这个Activity -->
        <intent-filter>
            <action android:name="android.nfc.action.TAG_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>
3. 编写核心写入逻辑

这里分Java和Kotlin两种版本,你选自己顺手的就行:

Java版本(MainActivity.java)

import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class MainActivity extends AppCompatActivity {
    private EditText etInput;
    private Button btnWrite;
    // 你要追加的固定前缀,用户不可见
    private static final String FIXED_PREFIX = "http://myweb.com?id=";
    private NfcAdapter nfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etInput = findViewById(R.id.et_input);
        btnWrite = findViewById(R.id.btn_write);
        // 获取NFC适配器实例
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);

        // 检查设备是否支持NFC
        if (nfcAdapter == null) {
            Toast.makeText(this, "当前设备不支持NFC功能", Toast.LENGTH_LONG).show();
            btnWrite.setEnabled(false);
            return;
        }

        // 检查NFC是否开启
        if (!nfcAdapter.isEnabled()) {
            Toast.makeText(this, "请先开启NFC功能", Toast.LENGTH_LONG).show();
            btnWrite.setEnabled(false);
            return;
        }

        // 设置按钮点击监听,提示用户准备好标签
        btnWrite.setOnClickListener(v -> {
            Toast.makeText(MainActivity.this, "请将NFC标签靠近设备", Toast.LENGTH_SHORT).show();
        });

        // 处理启动Activity时可能已经检测到的NFC标签
        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(android.content.Intent intent) {
        super.onNewIntent(intent);
        // 每次有新的NFC标签靠近时,都会触发这个方法
        handleIntent(intent);
    }

    private void handleIntent(android.content.Intent intent) {
        String action = intent.getAction();
        // 判断是否是NFC标签发现的动作
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            // 获取用户输入的内容,拼接固定前缀
            String userInput = etInput.getText().toString().trim();
            if (userInput.isEmpty()) {
                Toast.makeText(this, "请先输入内容", Toast.LENGTH_SHORT).show();
                return;
            }
            String contentToWrite = FIXED_PREFIX + userInput;
            // 执行写入操作
            writeNdefTag(tag, contentToWrite);
        }
    }

    private void writeNdefTag(Tag tag, String content) {
        try {
            // 检查标签是否支持NDEF格式
            Ndef ndef = Ndef.get(tag);
            if (ndef == null) {
                Toast.makeText(this, "该NFC标签不支持NDEF格式", Toast.LENGTH_SHORT).show();
                return;
            }

            // 创建NDEF记录,这里用UTF-8编码的文本类型
            NdefRecord record = NdefRecord.createTextRecord("en", content);
            NdefMessage message = new NdefMessage(new NdefRecord[]{record});

            // 打开标签连接
            ndef.connect();
            // 写入NDEF消息
            ndef.writeNdefMessage(message);
            // 关闭连接
            ndef.close();

            Toast.makeText(this, "写入成功!", Toast.LENGTH_SHORT).show();
        } catch (IOException | android.nfc.FormatException e) {
            e.printStackTrace();
            Toast.makeText(this, "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
}

Kotlin版本(MainActivity.kt)

import android.nfc.NdefMessage
import android.nfc.NdefRecord
import android.nfc.NfcAdapter
import android.nfc.Tag
import android.nfc.tech.Ndef
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.io.IOException

class MainActivity : AppCompatActivity() {
    private lateinit var etInput: EditText
    private lateinit var btnWrite: Button
    private val FIXED_PREFIX = "http://myweb.com?id="
    private var nfcAdapter: NfcAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        etInput = findViewById(R.id.et_input)
        btnWrite = findViewById(R.id.btn_write)
        nfcAdapter = NfcAdapter.getDefaultAdapter(this)

        // 检查NFC支持情况
        when {
            nfcAdapter == null -> {
                Toast.makeText(this, "当前设备不支持NFC功能", Toast.LENGTH_LONG).show()
                btnWrite.isEnabled = false
            }
            !nfcAdapter!!.isEnabled -> {
                Toast.makeText(this, "请先开启NFC功能", Toast.LENGTH_LONG).show()
                btnWrite.isEnabled = false
            }
            else -> {
                btnWrite.setOnClickListener {
                    Toast.makeText(this, "请将NFC标签靠近设备", Toast.LENGTH_SHORT).show()
                }
            }
        }

        // 处理启动时的NFC标签
        handleIntent(intent)
    }

    override fun onNewIntent(intent: android.content.Intent?) {
        super.onNewIntent(intent)
        intent?.let { handleIntent(it) }
    }

    private fun handleIntent(intent: android.content.Intent) {
        if (NfcAdapter.ACTION_TAG_DISCOVERED == intent.action) {
            val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return
            val userInput = etInput.text.toString().trim()
            if (userInput.isEmpty()) {
                Toast.makeText(this, "请先输入内容", Toast.LENGTH_SHORT).show()
                return
            }
            val contentToWrite = FIXED_PREFIX + userInput
            writeNdefTag(tag, contentToWrite)
        }
    }

    private fun writeNdefTag(tag: Tag, content: String) {
        try {
            val ndef = Ndef.get(tag) ?: run {
                Toast.makeText(this, "该NFC标签不支持NDEF格式", Toast.LENGTH_SHORT).show()
                return
            }

            val record = NdefRecord.createTextRecord("en", content)
            val message = NdefMessage(arrayOf(record))

            ndef.connect()
            ndef.writeNdefMessage(message)
            ndef.close()

            Toast.makeText(this, "写入成功!", Toast.LENGTH_SHORT).show()
        } catch (e: IOException) {
            e.printStackTrace()
            Toast.makeText(this, "写入失败:${e.message}", Toast.LENGTH_SHORT).show()
        } catch (e: android.nfc.FormatException) {
            e.printStackTrace()
            Toast.makeText(this, "写入失败:${e.message}", Toast.LENGTH_SHORT).show()
        }
    }
}
关键逻辑说明
  • 固定前缀处理:我把http://myweb.com?id=定义成了常量FIXED_PREFIX,只在代码里存在,用户完全看不到,完美符合你的需求。
  • NFC标签检测:Android会在NFC标签靠近时发送ACTION_TAG_DISCOVERED的意图,我们通过onNewIntent和handleIntent方法来捕获这个事件。
  • 写入流程:先检查标签是否支持NDEF格式(大部分常见NFC标签都支持),然后创建包含拼接后内容的NDEF消息,最后写入标签。
  • 异常处理:加入了IO异常和格式异常的捕获,避免APP崩溃,同时给用户友好的提示。

如果遇到NFC相关的其他问题,比如不同标签类型的兼容,或者写入后的读取测试,随时再问哈!

内容的提问来源于stack exchange,提问作者TMX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:19:55