Android NFC扫描方法

时间:2013-12-02 14:45:55

标签: android nfc

我正在创建一个也会使用NFC来阅读特定标签的应用。我有一个父活动类,我想把函数放在:

public String scanTagId(){...}

我能够从tag获得tagID问题,因为它只发生在onNewIntent上,所以实际上首先它会完成scanTagId()函数,然后实际调用onNewIntent。所以问题是如何编写scanTagId()来实际等待从NFC标签读取标签ID并返回带有此标签ID的字符串。

也许我需要以某种方式以不同的方式处理这个问题,或者这是不可能的 - 但是现在我试图解决这个问题让我很头疼:)

1 个答案:

答案 0 :(得分:0)

正如您所说,通常通过onNewIntent处理NFC。它的工作原理如下:每当手机检测到新的NFC标签(与您的过滤器匹配)时,TAG就会连接,您的应用会通过onNewIntent获得对TAG的引用。因此,您不需要额外的函数scanTagId(),因为设备已经一直在为TAG扫描。

如果您要禁用该应用获得通知,您可以这样做:

if (mNfcAdapter != null) {
        mNfcAdapter.disableForegroundDispatch(this);
    }

如果您想通过onNewIntent(重新)启用有关新TAG的通知,可以使用以下代码:

if (mNfcAdapter != null) {
        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
    }

如果你仍然必须拥有你提到的功能,我会将TAG-Id存储在一个实例变量中并实现如下函数:

protected String mLastTagId = "";

protected synchronized void setLastTagId(String id) {
    mLastTagId = id;
}

public synchronized String scanTagId(){
    return mLastTagId;
}

请注意,此功能不会等待连接TAG,而只会返回过去找到的最后一个TAG的ID。

更新

另一种方法是将onNewIntentscanTagId - 函数与wait()notifyAll()同步。我假设你想从主线程调用你的函数。结合同步,这是一件非常危险的事情,因此我严格建议不要这样做。它会让你的主线程进入睡眠状态,这会导致android通知用户(“应用程序没有响应”)甚至退出你的应用程序。至少你的应用程序不会响应UI事件。 如果您使用AsyncTask,可以避免这些影响。但我真的建议重新考虑你的设计并为异步事件做好准备。

你想要在第一时间实现什么目标?

UPDATE2

如果您想在未找到TAG的情况下经过特定时间后退出活动,则可以使用Timer

protected String tag = null;
protected Timer timer = new Timer();

在你的onCreate方法中激活计时器:

timer.schedule(new TimerTask() {
    public void run() {
        AlertDialog.Builder b = new AlertDialog.Builder(MyActivity.this);
        b.setTitle("Timeout").setMessage("Nothing found");
        b.setPositiveButton("OK", new OnClickListener() {
            MyActivity.finish();
        });
        b.setCancelable(false);
        b.create().show();
    }, 10000);

此代码尚未经过测试。