是否有可能强制Android检查NFC标签是否在附近?当android检测到它时,我只能读取标签,我想强制它检查标签是否在特定时刻附近
答案 0 :(得分:2)
您通常不可能做的事情。但是,如果你能忍受肮脏的黑客行为,那么以下内容将起作用(多亏了未指明的行为):
首先禁用所有支持的标记类型的reader-mode。这使NFC子系统进入清洁状态,例如,它确保NFC控制器不与标签连接。
完成后再次恢复阅读器模式。如果此时存在标记,您将获得通常的发现操作作为意图。可能需要一两秒钟。
使用NfcAdapter.enableReaderMode
和NfcAdapter.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