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
相关产品推荐
相关产品推荐

