Android NFC in Embarcadero XE5



尝试在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 调用它

但由于我以前从未这样做过,我不知道如何进行

编辑似乎我错过了一个标记,OP没有要求Java代码。无论如何都要留下来供将来参考

你的猜测是正确的,尽管可以在AndroidManifest.xml中定义你想要监听的意图,但前台调度确实将你的应用程序放在了的前面,让你能够捕获所有推出的NFC意图。

文档中的描述方式为您提供了线索。

我想你们已经熟悉安卓活动的生命周期,意向调度等等。


结构

使用以下结构,您将有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()}};
}

这个实际上还没有启用前景调度,它只是准备。该应用程序将接收Ndef和NdefFormatable技术我们为什么订阅ACTION_NDEF_DISCOVERED?

安卓试图处理意图的顺序如下:

  1. ACTION_NDEF_DISCOVERED
  2. 操作_搜索
  3. ACTION_TAG_DISCOVERED

因此,我们确保我们的应用程序是第一个被Android查看的应用程序。


启用FGD

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。

相关内容

  • 没有找到相关文章

最新更新