Адаптер 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 И если он включен. Но для использования всех функций я должен был определить все интерфейсы вручную и решить все циклические ссылки. Я не думаю, что это может привести к более прочному решению.

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

Solutions Collecting From Web of "Адаптер NFC Firemonkey для Android"

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

Чтобы работать с 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.

Введите описание изображения здесь

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

Введите описание изображения здесь

Чтобы читать, записывать или транслировать сообщения 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. } } } 

Введите описание изображения здесь

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

Введите описание изображения здесь

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