尝试在Embarcadero XE5中使用NFC在Android上运行。 从以下开始:https://forums.embarcadero.com/thread.jspa?threadID=97574 这似乎工作。现在想注册NFC Intent的回调
Java方法:
1. Register current activity as a listener
...
2. Receive Intent
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = NfcUtils.getNdefMessages(intent);
}
}
来源:http://www.jessechen.net/blog/how-to-nfc-on-the-android-platform/
Delphi方法(正如我想象的那样):
1. Define methods available in Java interface
来源:https://forums.embarcadero.com/thread.jspa?messageID=634212
Question:
How do I register a listener for NFC intent messages and
how do I eventually get messages?
我的猜测是调用enableForegroundDispatch
方法。将其定义为:
procedure enableForegroundDispatch; cddcl;
从Android API调用它
但是因为我之前从未这样做过,所以我不知道如何继续
答案 0 :(得分:0)
编辑: 好像我错过了一个标签,OP也没有要求提供Java代码。无论如何都要留待以后参考
您的猜测是正确的,虽然可以在AndroidManifest.xml中定义您想要侦听的意图,但前台调度确实会将您的应用放在前面中,让您能够捕获 所有 启动的NFC意图。
docs中描述的方式为您提供线索。
我假设您熟悉Android活动的lifecycle,Intent Dispatching等。
使用以下结构,您有4个字段:
private PendingIntent pendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mTechLists;
private NfcAdapter mNfcAdapter;
在onCreate
你得到:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
mIntentFilters = new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED)};
mTechLists = new String[][]{new String[]{Ndef.class.getName()},
new String[]{NdefFormatable.class.getName()}};
}
确实 实际上还没有启用Foreground Dispatch,这只是准备工作。 该应用程序将收到Ndef和NdefFormatable technologies 为什么我们订阅ACTION_NDEF_DISCOVERED?
Android尝试处理意图的顺序如下:
因此,我们确保我们的应用是Android首先看到的。
将以下代码行放在onResume
方法中:
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, mIntentFilters, mTechLists);
}
为什么这是onResume
?正如文档所述:enableForegroundDispatch() must be called from the main thread and only when the activity is in the foreground (calling in onResume() guarantees this)
这应该使您的应用程序能够在实际运行时接收意图。 如果您想在未运行时收到意图,则必须转到AndroidManifest。