Enable fgd
Put the following line of code in the onResume method :
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, mIntentFilters, mTechLists);
}
Why is this in the onResume? As the docs state : enableForegroundDispatch() must be called from the main thread and only when the activity is in the foreground (calling in onResume() guarantees this)
This should enable your app to receive the intent, of course, when actually running.
If you want to receive intents while not running, you’d have to go to the AndroidManifest.
Github — alberteije/nfc-e-desktop-delphi: nfc-e — delphi
Manual de Implantação da NFC-e Desktop [Delphi] disponível em http://www.alberteije.com/livros/delphi_nfce/.
Segue um vídeo apresentando este protótipo feito em Delphi.
Este é um protótipo funcional e com algum trabalho a mais você terá um sistema pronto para produção.
Configure a qualidade de exibição para «automático» ou selecione a melhor qualidade (HD).
Protótipo feito no Delphi XE5. Protótipo feito com arquitetura cliente/servidor (duas camadas).
Structure
Using the following structure, you’d have 4 fields :
private PendingIntent pendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mTechLists;
private NfcAdapter mNfcAdapter;
In the onCreate you’d get :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
mIntentFilters = new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED)};
mTechLists = new String[][]{new String[]{Ndef.class.getName()},
new String[]{NdefFormatable.class.getName()}};
}
This does not actually enable the Foreground Dispatch yet, it is just the preparation.
The application would receive the Ndef and NdefFormatable technologies
Why do we subscribe for ACTION_NDEF_DISCOVERED ?
The order in which Android tries to handle the intent is as such :
- ACTION_NDEF_DISCOVERED
- ACTION_TECH_DISCOVERED
- ACTION_TAG_DISCOVERED
So we make sure our app is the first to be looked at by Android.
Using nfc in delphi xe7 (and later) android apps
C:ProgramacaoEmbarcaderoStudio190sourcertlandroid
§
C:ProgramacaoEmbarcaderoStudio190sourcertlandroid
Адаптер nfc firemonkey для android
Да! Вы принимаете правильный подход.
Чтобы сделать работу Delphi и FireMonkey, вы можете использовать следующие , так как это правильный способ добиться того, что вы имеете в виду:
Интерфейс:
/ JNI NFC import demo
// Note - REQUIRES - PROJECT OPTIONS - USES PERMISSIONS - NFCinterface
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 Wallet.
Чтобы читать, записывать или транслировать сообщения 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 огромны, и спрос на такую технологию имеет тенденцию значительно расти:
Если вы можете использовать свой смартфон в качестве способа оплаты, то оплата за такие вещи, как общественный транспорт и парковочные счетчики, может быть такой же простой, как прокрутка телефона. Вы даже можете нажать на газетный терминал на ежедневной поездке, чтобы загрузить последнюю версию на свое устройство.