我一直在开发一款使用NFC标签做一些魔术的应用程序。
直到最近,我改变了一些与以前一直在使用的任何NFC代码无关的代码。
当我通过NFC tap启动我的应用程序时,所有工作都将在应用程序运行时点击onNewIntent()时接收未来的NFCTag。
当我通过图标启动我的应用程序并尝试在我的应用程序运行时点击时,我的onNewIntent()方法被调用,但当我尝试从意图中获取额外的NFCTag时,它返回null。
我是否认为即使它为null,我已正确设置ForegroundDispatch,因为我的onNewIntent()被调用了?
继承代码......
protected void onResume() {
if(this.mNfcAdapter==null) {
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
}
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter nfcFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
nfcFilter.addDataType("application/application.myorg.myapp");
} catch (MalformedMimeTypeException e) {
Log.e(TAG, "Error Setting FD for NFC", e);
}
String[][] mTechLists = new String[][] { new String[] { NfcF.class.getName() } };
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[] {nfcFilter}, mTechLists);
}
protected void onPause() {
super.onPause();
mNfcAdapter.disableForegroundDispatch(this);
Log.d(TAG, "Activity is pausing");
}
protected void onNewIntent(Intent intent) {
Log.d(TAG, "NFC TAP WHILE ACTIVE");
Tag tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
if(tag!=null) {
//NEVER CALLED WHEN LAUNCHED VIA ICON (NOT NFC)
Log.d(TAG, "TAG IS NOT NULL");
}
}
我在IntentFilter中设置的MIME类型与我在Manifest中的相同。
修改
我的清单
<activity
android:name="org.mypackage.myapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<data android:mimeType="application/org.mypackage.myapp" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
我的标签看起来像什么
+---------------------------------------------------+
| MIME:application/org.mypackage.myapp | StringData |
+---------------------------------------------------+
| EXT:android:com:pkg | org.mypackage.myapp |
+---------------------------------------------------+
答案 0 :(得分:4)
问题是如何在onNewIntent()
方法中检索意图。目前,您正在使用getIntent()
来获取尝试检索EXTRA_TAG
的意图。除非您使用setIntent(...)
进行更改(您在代码的相关部分显然不做什么),否则将返回最初启动您的活动的意图。 NFC发现意图将传递给参数onNewIntent()
中的Intent intent
方法。所以使用它应该可以解决问题:
protected void onNewIntent(Intent intent) {
Log.d(TAG, "NFC TAP WHILE ACTIVE");
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null) {
Log.d(TAG, "TAG IS NOT NULL");
}
}
此外,您可能想要检查您收到的意图是否确实具有您期望的意图操作(例如ACTION_NDEF_DISCOVERED
)。
还有一件事:当您注册mTechLists
意图时,可以安全地将null
设置为NDEF_DISCOVERED
。技术列表仅用于TECH_DISCOVERED
意图过滤器。