我有一个持续的问题,我的应用在NFC标签扫描后向接收Activity传递多个意图。
我的应用程序基本上会扫描一个带有一些数据的NFC标签并将其发送到服务器。通常情况下它工作得很好。我知道NFC在几厘米的范围内工作,并且也许我的问题是用户错误,例如用户在标签周围挥动手机,这可能会在毫秒内扫描两次。
我在应用程序对象中放置了一个计时器。当用户扫描标签时,我启动计时器并将标志设置为false,在处理NFC意图的Activity中检查该标志,如果标志为false,则放弃意图。这(应该)可以防止在10秒内多次扫描标签。
我的应用程序用于家庭护理工作,因此用户将在客户家中扫描标签。当他们第一次扫描标签时,它会记录他们在该客户端的登录时间和数据。第二次扫描标签将使他们退出登录。
总的来说,它工作得很好,但有时护理人员会在第一个客户端登录和退出,然后在第二个客户端或几小时后,护理人员将在先前的客户端重新登录。
我认为发生的事情是护理人员误扫了标签,这导致NFC适配器触发两次。第一个意图立即传递,然后几分钟/几小时后传递第二个。
事物的流程如下。 扫描标签->意图传递到Activity->启动AppObj计时器。 将数据写入sqlite DB->启动IntentService将交易发送到服务器(10秒后取消)。
有人能看出我错过了什么问题,可以解释为什么会在几个小时后传递重复的意图吗?
有人能提出一个解决方案来防止这种情况发生吗?
处理意图的活动是否存在问题?例如,在错误的Activity生命周期方法中使用了错误的代码?
有没有办法取消/拦截第二个误扫的意图?
基本上,我希望nfcAdapter可以在一秒钟内触发10次,但只有第一次扫描被传递到该Activity。我该如何实现这一点?
我将发布一些代码。
[编辑2]
我的应用程序基本上会扫描一个带有一些数据的NFC标签并将其发送到服务器。通常情况下它工作得很好。我知道NFC在几厘米的范围内工作,并且也许我的问题是用户错误,例如用户在标签周围挥动手机,这可能会在毫秒内扫描两次。
我在应用程序对象中放置了一个计时器。当用户扫描标签时,我启动计时器并将标志设置为false,在处理NFC意图的Activity中检查该标志,如果标志为false,则放弃意图。这(应该)可以防止在10秒内多次扫描标签。
我的应用程序用于家庭护理工作,因此用户将在客户家中扫描标签。当他们第一次扫描标签时,它会记录他们在该客户端的登录时间和数据。第二次扫描标签将使他们退出登录。
总的来说,它工作得很好,但有时护理人员会在第一个客户端登录和退出,然后在第二个客户端或几小时后,护理人员将在先前的客户端重新登录。
我认为发生的事情是护理人员误扫了标签,这导致NFC适配器触发两次。第一个意图立即传递,然后几分钟/几小时后传递第二个。
事物的流程如下。 扫描标签->意图传递到Activity->启动AppObj计时器。 将数据写入sqlite DB->启动IntentService将交易发送到服务器(10秒后取消)。
有人能看出我错过了什么问题,可以解释为什么会在几个小时后传递重复的意图吗?
有人能提出一个解决方案来防止这种情况发生吗?
处理意图的活动是否存在问题?例如,在错误的Activity生命周期方法中使用了错误的代码?
有没有办法取消/拦截第二个误扫的意图?
基本上,我希望nfcAdapter可以在一秒钟内触发10次,但只有第一次扫描被传递到该Activity。我该如何实现这一点?
我将发布一些代码。
[编辑2]
Toast.makeText(this, "about to test flags", Toast.LENGTH_LONG).show();
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
Toast.makeText(this, "intent is from history", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, "intent is not from history", Toast.LENGTH_LONG).show();
}
[编辑3]
<activity
android:name=".NfcscannerActivity"
android:screenOrientation="portrait"
>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="com.carefreegroup.rr3.QRCODE_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
<activity
android:name=".EntryActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.carefreegroup.rr3.INVALID_CARER_TAG_SCANNED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
. [edit4]
Tag tagTest = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndefTag = Ndef.get(tagTest);
try {
Log.e(TAG, "about to test io operations on Ndef Tag");
ndefTag.connect(); // this should already perform an IO operation and should therefore fail if there is no tag
NdefMessage ndefMsg = ndefTag.getNdefMessage(); // this reads the current NDEF message from the tag and consequently causes an IO operation
Log.e(TAG, "tested io operations on Ndef Tag, must be a real Tag!!!!!******!!!!!!");
} catch (Exception e) {
// there is no tag or communication with tag dropped
Log.e(TAG, "tested io operations on Ndef Tag, No Tag there, must be a re-delivery of the old Tag via an intent!!!!!******!!!!!!!!!!!!!!!!!!!!!!");
onResume();
} finally {
try {
ndefTag.close();
} catch (Exception e) {
}
}
} else { Log.e(TAG, "ndef not discovered!!!!!!"); }
没有匹配的if ... {
)。请发布你正确(并且格式正确)的代码。 - Michael RolandonCreate
中处理意图还是也会在onStart
或onResume
中进行处理? - Michael Roland