gpt4 book ai didi

android - Firemonkey 安卓 NFC 适配器

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:32 37 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

接口(interface):

/ 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 以来引入的。

enter image description here

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

enter image description here

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

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

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

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

<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 extra 包含一个代表扫描标签的原始标签对象。 NfcAdapter.EXTRA_TNDEF_MESSAGES extra 包含一组 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.
}
}
}

enter image description here

NFC applications的潜力和可能性是巨大的,对这种技术的需求往往会显着增长:

enter image description here

如果您可以使用智能手机作为支付方式,那么支付公共(public)交通和 parking 计时器等费用就可以像刷手机一样简单。您甚至可以在每天上下类途中点击报纸终端,将最新一期下载到您的设备上。

关于android - Firemonkey 安卓 NFC 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650883/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com