连续按下NFC卡到NFC读卡器(" LongPress")

时间:2016-07-11 14:40:14

标签: android events android-intent tags nfc

这通常是我的应用中检测到NFC标签的方式:

protected void onNewIntent(Intent intent) {      
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
        Tag nfcTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        ...
    }
}

现在我还需要听一下NFC标签是否长时间(约3秒)靠近阅读器。在那种情况下,我想做一些其他事情(类似于区分正常按压和视图上的长按)。这可能吗?

2 个答案:

答案 0 :(得分:1)

方法

  

isConnected()

告诉您与标记的连接是否仍然存在。如果定期检查连接,则可以检测到长连接。

答案 1 :(得分:0)

NFC背后的概念是在标签和NFC设备(或两个NFC设备)之间快速交换少量数据,而不是检测交互的持续时间。因此,没有专门的事件可以让您区分短期和稍长的交互。

作为corvairjo wrote,您可以连接到标签并检查标签是否在一定时间(例如3秒)后仍然连接。但是,您只能衡量从应用程序收到有关标记的通知的时间点(即在调用onNewIntent()之后)。您无法衡量Android在用户实际扫描标记后通知您的应用所需的时间。

请注意isConnected()本身对所有设备/标签组合都不可靠。测试标记是否仍然存在的最可靠方法是向标记发送有效命令并检查是否得到响应:

new AsyncTask<Tag, Void, Boolean>() {
    protected Boolean doInBackground(Tag... tags) {
        try {
            Thread.sleep(3000);

            // test if tag is still connected
            Ndef ndef = Ndef.get(tags[0]);
            if (ndef != null) {
                try {
                    ndef.connect();
                    ndef.getNdefMessage();
                } finally {
                    ndef.close();
                }
                return Boolean.TRUE;
            }
        } catch (Exception e) {
        }

        return Boolean.FALSE;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            // "long press" event
        }
    }
}.execute(tag);

如果您的代码支持NDEF(Ndef代码技术),您只需使用Ndef.getNdefMessage()查询代码的NDEF消息(参见上文)。如果你的标签不支持NDEF,你首先需要找出标签支持的命令,然后使用正确的标签技术发送这样的命令。

E.g。如果您的标签是MIFARE Ultralight或NTAG标签(或任何NFC论坛类型2标签),您可以使用:

// test if tag is still connected
NfcA nfca = NfcA.get(tags[0]);
if (nfca != null) {
    try {
        nfca.connect();
        byte[] response = nfca.transceive(new byte[] { (byte)0x30, (byte)0x00 });
        if ((response != null) && (response.length > 0))
            return Boolean.TRUE;
        }
    } finally {
        ndef.close();
    }
}