【问题标题】:Firemonkey android NFC AdapterFiremonkey 安卓 NFC 适配器
【发布时间】:2014-07-09 10:12:05
【问题描述】:

我是 Firemonkey 和 Android 的新手,我不知道我是否有错误的方法。我想运行一个应用程序并读取 NFC-Tag。

有没有办法在带有 firemonkey 的安卓设备中使用 NFC 阅读器?

通过 FMXExpress (http://www.fmxexpress.com/full-android-sdk-interface-files-in-object-pascal-for-firemonkey/) 的 NFCAdapter 的一部分,我可以确定设备是否具有 NFC 读取器以及是否已启用。但是要使用所有功能,我必须手动定义所有接口并解决所有循环引用。我不认为这会导致探测解决方案。

我面临着构建自己的 JavaClass 以与 nfc 适配器通信的解决方案,就像这篇博文中描述的那样:http://blong.com/Articles/DelphiXE5AndroidActivityResult/ActivityResult.htm#Building

【问题讨论】:

  • 如果你仍然坚持这一点,@deterministicFail,我已经写了如何在 XE5、XE6 和 XE7 的 Delphi Android 应用程序中读取和写入 NFC 标签。您可以在此处找到包含所有三篇文章链接的帖子:blog.blong.com/2014/09/delphi-and-nfc-on-android.htmlEnjoy!

标签: android delphi nfc firemonkey delphi-xe6


【解决方案1】:

是的!您正在采取正确的方法。

要使 Delphi 和 FireMonkey 工作,您可以使用以下 template,因为这是实现您的想法的正确方法:

界面:

/ JNI NFC import demo
// Note - REQUIRES - PROJECT OPTIONS - USES PERMISSIONS - NFC

interface

uses
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText,
  FMX.Helpers.Android,
  SysUtils,
  Classes;

type

NFC 适配器:

  /////////////////////////// NfcAdapter /////////////////////////////////
  JNfcManager = interface;
  JNfcAdapter = interface;

  JNfcAdapterClass = interface(JObjectClass)
  ['{634258AC-7931-4E38-97E6-48DBF688A288}']
    {Property methods}
    function _ACTION_TAG_DISCOVERED: JString; cdecl;
    function _EXTRA_ID: JString; cdecl;
    function _EXTRA_NDEF_MESSAGES: JString; cdecl;
    function _EXTRA_TAG: JString; cdecl;
    {Properties}
    property ACTION_TAG_DISCOVERED: JString read _ACTION_TAG_DISCOVERED;
    property EXTRA_ID: JString read _EXTRA_ID;
    property EXTRA_NDEF_MESSAGES: JString read _EXTRA_NDEF_MESSAGES;
    property EXTRA_TAG: JString read _EXTRA_TAG;
  end;

  [JavaSignature('android/nfc/NfcAdapter')]
  JNfcAdapter = interface(JObject)
  ['{364D8F3F-23AE-4C28-A261-E30C0893B24C}']
    //Return true if this NFC Adapter has any features enabled
    function isEnabled: Boolean; cdecl;
  end;

  TJNfcAdapter = class(TJavaGenericImport<JNfcAdapterClass, JNfcAdapter>) end;

NfcManager:

  /////////////////////////// NfcManager /////////////////////////////////

  JNfcManagerClass = interface(JObjectClass)
  ['{812481E1-F491-47D2-AC1F-4C5AB509532B}']
  end;

  [JavaSignature('android/nfc/NfcManager')]
  JNfcManager = interface(JObject)
  ['{04B707EC-966A-4E4F-85DC-F003B7C9ACE3}']
    {Methods}
    function getDefaultAdapter: JNfcAdapter; cdecl;
  end;

  TJNfcManager = class(TJavaGenericImport<JNfcManagerClass, JNfcManager>) end;

function HasNfc: Boolean;
function IsNfcEnabled: Boolean;

implementation

function GetNfcManager: JNfcManager;
var
  ConnectivityServiceNative: JObject;
begin
  ConnectivityServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.NFC_SERVICE);
  if not Assigned(ConnectivityServiceNative) then
    raise Exception.Create('Could not locate Nfc Service');
  Result := TJNfcManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Nfc Manager');
end;

function HasNfc: Boolean;
var
  NfcManager: JNfcManager;
  NfcAdapter: JNfcAdapter;
begin
  NfcManager := GetNfcManager;
  NfcAdapter := NfcManager.getDefaultAdapter;
  Result := Assigned(NfcAdapter);
end;

function IsNfcEnabled: Boolean;
var
  NfcManager: JNfcManager;
  NfcAdapter: JNfcAdapter;
begin
  NfcManager := GetNfcManager;
  NfcAdapter := NfcManager.getDefaultAdapter;
  Result := Assigned(NfcAdapter)and NfcAdapter.isEnabled;
end;

end.

{code}

usage
Memo1.Lines.Add('Nfc Enabled: '+BoolToStr(IsNfcEnabled, True));

如果您使用此示例代码,我很确定它会起作用!

我想,你不得不充分利用一切,例如使用完全跨平台和多平台的 API,这将让你在 Android and iOS 上运行完全相同的代码,而无需更改你的应用程序前端和后端。是的,确实有些工具目前正在开发中,旨在解决真正的多平台嵌入式development,在不久的将来应该可以实现完全集成。不幸的是,现实情况是,在移动平台开发的当前阶段,如果您正在实现更基本的应用程序,而不依赖于更具体的资源,例如 NFC、Geofencing 等,您只能使用这样的多平台工具. 当然,如果你不是在生产环境中,那么最终你可能有所有的时间去玩和玩。但假设情况并非如此,那么请继续专注于将事情放在一起以快速工作,因为交付期限通常很紧。

也就是说,实现 NFC 标签通信的最快和最短的方法是使用 Android NFC API 资源,因为它是从 API 级别 9 - Android Gingerbread 开始引入的。

NFC 传输可以发生在两个启用 NFC 的设备之间,或者一个设备和一个 NFC“标签”之间。标签的范围可以从扫描时传输 URL 的被动标签到 NFC 支付解决方案中使用的复杂系统,例如 Google Wallet

为了读取、写入或广播 NFC 消息,您的应用需要 NFC 清单权限:

<uses-permission android:name=”android.permission.NFC” />

当 Android 设备用于扫描 NFC 标签时,系统将使用自己的标签调度系统对传入的有效载荷进行解码,该系统会分析标签,对数据进行分类,并使用 Intent 启动应用程序以接收数据.

这里是一个快照代码,展示了如何注册一个只响应NFC tags的活动:

<activity android:name=”.BlogViewer”>
    <intent-filter>
        <action android:name=”android.nfc.action.NDEF_DISCOVERED”/>
        <category android:name=”android.intent.category.DEFAULT”/>
        <data android:scheme=”http”android:host=”blog.example.com”/>
    </intent-filter>
</activity>

NfcAdapter.EXTRA_TAG 额外包含一个表示扫描标签的原始标签对象。 NfcAdapter.EXTRA_TNDEF_MESSAGES 额外包含一个 NDEF 消息数组:

String action = getIntent().getAction();

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
    Parcelable[] messages =
    intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    for (int i = 0; i < messages.length; i++) {
        NdefMessage message = (NdefMessage)messages[i];
        NdefRecord[] records = message.getRecords();
        for (int j = 0; j < records.length; j++) {
            NdefRecord record = records[j];
            // TODO Process the individual records.
        }
    }
}

NFC applications 的潜力和可能性巨大,对此类技术的需求趋于显着增长:

如果您可以使用智能手机作为支付方式,那么支付公共交通和停车咪表等费用就像刷手机一样简单。您甚至可以在日常通勤途中点击报纸终端,将最新一期下载到您的设备上。

【讨论】:

  • 感谢您的详细解答。不幸的是,我绑定了 delphi 和 firemonkey。
  • 感谢您的努力。这个接口是我在我的问题中的意思,并且是网络上唯一的 delphi 示例。根据我的研究,我得出的结论是,目前唯一正确的方法是实现自己的 JavaClass 并从 Firemonkey 中使用它。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多