Адаптер NFC Firemonkey для Android

Я новичок в Firemonkey и Android, и я не знаю, есть ли у меня неправильный подход. Я хочу запустить приложение и прочитать NFC-тег.

Есть ли способ использовать NFC Reader в устройствах Android с firemonkey?

С частью NFCAdapter от FMXExpress (http://www.fmxexpress.com/full-android-sdk-interface-files-in-object-pascal-for-firemonkey/) я могу определить, есть ли у устройства NFC Reader и если он включен. Но для использования всех функций я должен был определить все интерфейсы вручную и решить все циклические ссылки. Я не думаю, что это может привести к более эффективному решению.

Мне нужно решение для сборки моего собственного JavaClass для связи с адаптером nfc, как описано в этом сообщении в блоге: http://blong.com/Articles/DelphiXE5AndroidActivityResult/ActivityResult.htm#Building

Ответ 1

Да! Вы принимаете правильный подход.

Чтобы сделать работу Delphi и FireMonkey, вы можете использовать следующие , так как это правильный способ добиться того, что вы имеете в виду:

Интерфейс:

/ 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 и iOS без каких-либо изменений в вашем интерфейсе и интерфейсе приложения. Да, верно, что некоторые инструменты в настоящее время находятся в стадии разработки для решения реальной многоплатформенной встроенной разработки, которая должна полностью интегрировать интеграцию, возможно, в ближайшую будущее. К сожалению, на самом деле на нынешних этапах разработки мобильных платформ вы можете использовать только такие многоплатформенные инструменты, если вы используете более простые приложения, которые не будут зависеть от более конкретных ресурсов, таких как NFC, Geofencing и т.д. Конечно, если вы не находитесь в производственной среде, то в конечном итоге у вас может быть все время, чтобы играть и взламывать ради удовольствия. Но предположим, что это не так, а затем сосредоточьтесь на том, чтобы собрать вещи вместе, чтобы работать быстро, так как срок доставки обычно плотный.

Тем не менее, быстрый и кратчайший путь к достижению связи с NFC-тегами - это просто сделать это с помощью ресурса API NFC API, поскольку он был введен с уровня API 9 - Android Gingerbread.

enter image description here

Передачи NFC могут происходить между двумя устройствами с поддержкой NFC или между устройством и тегом NFC. Теги могут варьироваться от пассивных тегов, которые передают URL-адрес при сканировании в сложные системы, как те, которые используются в платежных решениях NFC, например Google Wallet.

enter image description here

Чтобы читать, записывать или транслировать сообщения NFC, вашему приложению требуется разрешение манифеста NFC:

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

Когда устройство Android используется для сканирования тега NFC, система будет декодировать входящую полезную нагрузку, используя собственную систему отправки тегов, которая анализирует тег, классифицирует данные и использует намерение для запуска приложения для приема данных.

Вот код моментального снимка, показывающий, как регистрировать активность, которая будет отвечать только на теги NFC:

<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 дополнительно добавлен необработанный объект 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.
        }
    }
}

enter image description here

Потенциал и возможности приложений NFC огромны, и спрос на такую ​​технологию имеет тенденцию значительно расти:

enter image description here

Если вы можете использовать свой смартфон в качестве способа оплаты, то оплата за такие вещи, как общественный транспорт и парковочные счетчики, может быть такой же простой, как прокрутка телефона. Вы даже можете нажать на газетный терминал на ежедневной поездке, чтобы загрузить последнюю версию на свое устройство.