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

时间:2014-08-03 17:42:12

标签: android nfc ndef

我已创建此活动以创建我自己的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();
    }
}

我在清单中使用此过滤器来触发它以启动写入操作

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

<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标记,否则我的应用无法识别该标记。< / p>

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

1 个答案:

答案 0 :(得分:2)

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

相反,您可以使用TECH_DISCOVERED意图过滤器注册发现任何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())) {

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