【问题标题】:Catch continuous pressing of the NFC card to NFC reader ("LongPress")捕捉 NFC 卡对 NFC 读卡器的连续按压(“LongPress”)
【发布时间】:2016-07-11 14:40:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: android events android-intent tags nfc


    【解决方案1】:

    方法

    isConnected()

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

    【讨论】:

    • 是 Ndef isConnected() 方法吗?但是我的卡除了 nfc ID 什么都没有,因此 Ndef 始终为空
    • 你可以试试:nfcTag.connect(); boolean connected = nfcTag.isConnected(); nfcTag.close();
    【解决方案2】:

    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,您首先需要找出您的标签支持哪些命令,然后使用适当的标签技术发送此类命令。

    例如如果您的标签是 MIFARE Ultralight 或 NTAG 标签(或任何 NFC Forum Type 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多