在我的Android应用程序中,一旦android清单检测到nfc标记,它就会打开loginactivity
类。
loginactivity
使用(NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {}
在代码上运行各种功能。
我还想使用intentfilter
和enableForegroundDispatch
如何在同一类中结合两种类型的nfc检测?
我认为可行的方法:
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
onNewIntent(GetIntent());
}
else{
pendingIntent = PendingIntent.getActivity(this,0,new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
intentFiltersArray= new IntentFilter[] {ndef, };
techListsArray = new String[][] {new String[] {IsoDep.class.getName()}};
}
当然onPause和onResume已启用前台dispacth。
这是正确的方法吗?谢谢!
答案 0 :(得分:0)
您可以轻松组合这两种方法(在应用程序清单中使用NFC发现意图,在检测到NFC标签时启动您的活动,并使用前台调度接收事件,同时您的活动在前台可见)。
对于清单部分,你会做这样的事情(或适应你想要触发的任何事件):
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
您的nfc_tech_filter.xml可能看起来像这样(或适用于您要触发的任何标记技术):
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
</tech-list>
</resources>
然后,在您的活动的onCreate()
,onStart()
或onResume()
方法中,您将获取意图并将其提供给您的意图处理方法。这可能看起来像这样:
handleIntent(getIntent());
为了使用前台调度,您可以在活动的onResume()
方法中注册前台调度系统(不要忘记在onPause()
取消注册!) :
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
或者你也可以只使用IsoDep技术注册TECH_DISCOVERED意图(就像在清单中一样):
nfcAdapter.enableForegroundDispatch(this, pendingIntent,
new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED) },
new String[][] { new String[] { IsoDep.class.getName() } }
);
然后,您将在活动的onNewIntent()
方法中收到NFC意图。因此,您将指示您的意图处理程序也处理这些意图:
public void onNewIntent(Intent intent) {
handleIntent(intent);
}
最后,您可以使用这样的意图处理程序来处理意图:
private void handleIntent(Intent intent) {
String action = intent.getAction();
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
// do something ...
}
}
}