我有一个带有多个活动的android应用。我希望当前活动能够处理nfc发现的事件,因为应用程序的状态决定了我想对标签执行什么操作
从所附的代码中可以看出,我已经为每个活动设置了意图,并在每个活动中实现了onResume,onPause和onNewIntent方法。
但是,由于某些原因,即使其他活动之一是活动活动,MainActivty也是唯一被调用的活动。例如。它是具有当前GUI的那个。
你们知道如何进行主动活动来处理发现的NFC吗?
任何帮助都非常感激:)
这是ApplicationManifest
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<activity
android:name=".ConfigureStableNamesActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED " />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="www.nxp.com"
android:pathPrefix="/products/identification_and_security/smart_label_and_tag_ics/ntag/series/NT3H1101_NT3H1201.html"
android:scheme="http" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- <action android:name="android.nfc.action.ACTION_TAG_DISCOVERED"/>-->
<action android:name="android.nfc.action.NDEF_DISCOVERED " />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="www.nxp.com"
android:pathPrefix="/products/identification_and_security/smart_label_and_tag_ics/ntag/series/NT3H1101_NT3H1201.html"
android:scheme="http" />
</intent-filter>
</activity>
在我的每项活动中,我都有这段代码来处理NFC发现的意图
@Override
protected void onResume() {
super.onResume();
ntagHandler.start();
}
@Override
protected void onPause() {
super.onPause();
ntagHandler.stop();
}
@Override
protected void onNewIntent(Intent intent) {
try {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
nfcHandler = new NearFieldCommunicationHandler(tag);
nfcHandler.connect();
// DO SOMETHING HERE
// dataModel.readStableNames(nfcHandler);
} catch(IOException e) {
Toast.makeText(this, "Caught exception: " + e.toString(), Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:0)
您需要实现“前台调度系统”。它允许活动拦截意图并要求其优先于其他活动。请参阅:https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc#java
首先在您的每个活动中全局创建未决Intent,如下所示:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
然后全局获取IntentFilter并使用null进行初始化,如下所示:
IntentFilter[] intentFiltersArray = null;
Write below code in onCreate() method:
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*"); /* YOU CAN TYPE HERE EITHER android.nfc.action.NDEF_DISCOVERED or
android.nfc.action.ACTION_TAG_DISCOVERED */
}
catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
IntentFilter[] intentFiltersArray = new IntentFilter[] {ndef, };
然后按如下所示全局获取techListsArray:
String[][] techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
最后编写以下代码,以在活动失去(onPause())和重新获得(onResume())焦点时启用和禁用前台调度。必须从主线程调用enableForegroundDispatch(),并且仅在活动处于前台时才调用(调用onResume()可以保证做到这一点)
public void onPause() {
super.onPause();
nfcadapter.disableForegroundDispatch(this);
}
public void onResume() {
super.onResume();
nfcadapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//do something with tagFromIntent
}