检查NFC标签是否在附近

时间:2014-11-19 13:16:41

标签: android nfc

是否有可能强制Android检查NFC标签是否在附近?当android检测到它时,我只能读取标签,我想强制它检查标签是否在特定时刻附近

3 个答案:

答案 0 :(得分:2)

您通常不可能做的事情。但是,如果你能忍受肮脏的黑客行为,那么以下内容将起作用(多亏了未指明的行为):

首先禁用所有支持的标记类型的reader-mode。这使NFC子系统进入清洁状态,例如,它确保NFC控制器不与标签连接。

完成后再次恢复阅读器模式。如果此时存在标记,您将获得通常的发现操作作为意图。可能需要一两秒钟。

使用NfcAdapter.enableReaderModeNfcAdapter.disableReaderMode

可以控制阅读器模式

答案 1 :(得分:0)

我想出了一些有用的黑客(至少对我而言!)

首先,当您最初通过android.nfc.action.NDEF_DISCOVERED检测到标记时,将标记作为类中的字段并启动计时器(这在C#/ Xamarin中,但同样适用于Java):

_tag = Intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;

ReaderTimer = new Timer(2000);
ReaderTimer.Elapsed += TimerElapsed;
ReaderTimer.Start();

现在,每2秒就会发射一次。它将尝试重新连接到标签。如果标签不能用完。:

    private void TimerElapsed(object sender, ElapsedEventArgs e)
    {
        if (_tag == null)
        {
            return;
        }

        Ndef ndef = Ndef.Get(_tag);

        if (ndef == null)
        {
            // NDEF is not supported by this Tag.
            return;
        }

        if (!ndef.IsConnected)
        {
            try
            {
                ndef.Close();
                ndef.Connect();
            }
            catch (Exception ex)
            {
                // could not reconnect
                // implies tag is not in proximity

                //do whatever needs to be done when NFC is disconnected

                ReaderTimer.Stop();
            }
        }
    }

我已经使用API​​ 14对此进行了测试。

不幸的是,当屏幕关闭时ndef.Connect()失败,因此注册为断开连接。

答案 2 :(得分:0)

试试这个代码吧!它会不断检查NFC标签是否靠近手机。

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    readFromIntent(intent);
    if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){
        myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
        checkNFCStatus();
        handler.postDelayed(this,1000);
        }

    }, 1000);

    }
}

public void checkNFCStatus(){
    try {
        if(myTag != null) {
            Ndef ndefTag = Ndef.get(myTag);
            ndefTag.connect();
            if (ndefTag.isConnected()) {
                Log.d("network", "NFC connected");
            } else {
                Log.d("network", "NFC disconnected");
            }
            ndefTag.close();
        }

    } catch (IOException e) {
        e.printStackTrace();
        Log.d("network", "NFC disconnected");
    }
}

//If the connection is not closed, an exception will be thrown