首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firemonkey适配器

Firemonkey适配器
EN

Stack Overflow用户
提问于 2014-07-09 10:12:05
回答 1查看 5.6K关注 0票数 11

我是新来的火猴和Android,我不知道我是否有错误的方法。我想让一个应用程序运行,并阅读一个NFC标签。

有没有一种方法可以使用NFC阅读器在android设备与火猴?

使用NFCAdapter的一部分FMXExpress (http://www.fmxexpress.com/full-android-sdk-interface-files-in-object-pascal-for-firemonkey/),我可以确定设备是否有NFCAdapter,以及是否启用了它。但是要使用所有函数,我必须手动定义所有接口,并解决所有循环引用。我认为这不可能导致一个更好的解决方案。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-26 07:18:05

是!你采取了正确的方法。

要使德尔福和FireMonkey发挥作用,您可以使用以下模板,因为这是实现您所想到的目标的正确方法:

接口:

代码语言:javascript
复制
/ 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适配器:

代码语言:javascript
复制
  /////////////////////////// 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:

代码语言:javascript
复制
  /////////////////////////// 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,这样你就可以在安卓和iOS上运行完全相同的代码,而你的应用程序的前端和后端不会有任何变化。是的,目前正在开发一些工具来解决真正的多平台嵌入式开发,这将在不久的将来实现完全集成。不幸的是,在移动平台开发的当前阶段,只有在您实现更基本的应用程序而不依赖于更具体的资源(如NFC、地学等)的情况下,您才能使用这样的多平台工具。当然,如果您不在生产环境中,那么最终您可能会有所有的时间去玩和黑客操作。但如果不是这样的话,那就把注意力集中在一起,尽快完成任务,因为交货期限通常都很紧。

也就是说,实现NFC标记通信的最快和最短的方式就是简单地使用Android资源,因为它是从API级别9- Android姜饼开始引入的。

NFC传输可以发生在两个启用NFC的设备之间,或者发生在设备和NFC“标记”之间。标记可以从扫描时传输URL的被动标记到复杂系统(如NFC支付解决方案中使用的),例如谷歌钱包

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

代码语言:javascript
复制
<uses-permission android:name=”android.permission.NFC” />

当使用Android设备扫描NFC标记时,系统将使用自己的标记分派系统解码传入的有效载荷,该系统分析标签,对数据进行分类,并使用启动应用程序接收数据的意图。

下面是一个快照代码,展示了如何注册将只响应于NFC标签的活动

代码语言:javascript
复制
<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消息数组:

代码语言:javascript
复制
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应用的潜力和可能性是巨大的,对这种技术的需求往往会显著增长:

如果你可以用你的智能手机作为一种支付方式,那么支付像公共交通和停车收费表这样的东西就像刷你的手机一样简单。你甚至可以在每天上下班的时候点击一个报纸终端,把最新的问题下载到你的设备上。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24650883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档