android - 如何将 NDEF 消息写入任何 MIME 类型的 NFC 标签?

标签 android nfc ndef

我创建此 Activity 是为了创建我自己类型的 NFC 标签

public class WriteTag extends Activity {

    Tag tag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.write_tag);
    }

    public void onResume()
    {
        super.onResume();
        Intent intent = getIntent();
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
            tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            try {
                write("my/type", "this is payload text", tag);
                finish();
            }
            catch(Exception e)
            {

            }
        }
    }

    private NdefRecord createRecord(String mimeType, String text) throws UnsupportedEncodingException {

        NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "my/type".getBytes(Charset.forName("US-ASCII")), new byte[0], text.getBytes(Charset.forName("US-ASCII")));
        return recordNFC;
    }

    private void write(String mimeType, String text, Tag tag) throws IOException, FormatException {

        NdefRecord[] records = { createRecord(mimeType, text) };
        NdefMessage message = new NdefMessage(records);
        Ndef ndef = Ndef.get(tag);
        ndef.connect();
        ndef.writeNdefMessage(message);
        ndef.close();
    }
}

我在 list 中使用此过滤器来触发它开始写入操作

否则我不知道如何获取标签实例

<activity android:name=".WriteTag">
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="my/tag" />
    </intent-filter>
</activity>

但是有一个大问题,我必须先使用另一个应用my/type写入NFC标签,否则我的应用无法识别该标签。

如何强制应用程序写入任何 NFC 标签?为什么其他应用程序可以让用户:1点击按​​钮,2等待标签接近,3写入标签?

最佳答案

NDEF_DISCOVERED Intent 过滤器只能用于已包含某些(已知)NDEF 数据类型的标签。

相反,您可以使用 TECH_DISCOVERED Intent 过滤器来注册以发现任何 NdefNdefFormatable 标记(或最适合您需求的任何其他标记类型) :

<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" />

您的 xml/nfc_tech_filter.xml 文件如下所示:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
    </tech-list>
</resources>

在您的代码中,您当然需要替换该行

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {

或者(或与上述方法结合),您可以使用前台调度方法在您的 Activity 位于前台时仅接收这些 NFC 事件(而不是在检测到任何时启动) NDEF(兼容)标记(不由具有更好匹配的 NDEF_DISCOVERED 过滤器的 Activity 处理),这可能会让用户感到烦恼。有关如何执行此操作的更多详细信息,请参阅 this answer

关于android - 如何将 NDEF 消息写入任何 MIME 类型的 NFC 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107354/

相关文章:

android - 为什么 Google Pay 在我的应用程序安装后停止工作?

android - NFC 在后台

java - 将多条记录写入NFC标签: example source code

android - 读取NFC手机数据,使用NFC Reader

Android Kotlin 在其他 Activity 中调用函数

android - 在android中画圆

android - 如何将数据从 recyclerview 中单击的项目传递到 viewmodel 并打开新 Activity ?

java - 无法向覆盖的方法添加 throws 子句导致我必须返回 null

java - 安卓光束 : suppress "Tab to beam"

android - 向 NFC-V 中的特定内存块(位置)写入和读取多个值