我正在尝试使用Delphi 10.3.1读写PC / SC智能卡的内容,而在Android Apps上却没有成功。我找到了一些相关主题,但是它们涉及NFC读写,因此我需要使用通过mini-USB端口连接的Gemalto IDBridge CT-30读卡器来实现。
为了确保有可能,我已经在手机上安装了ATR阅读器应用程序,并且运行正常。直到现在,我仍无法通过读卡器连接,读取和写入智能卡数据。
我在某些搜索中找到了此代码,也可以在this answer中看到该代码:
unit Androidapi.JNI.NfcAdapter;
// 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
/////////////////////////// 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 /////////////////////////////////
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.
此代码仅提供NFC连接,但目标设备没有NFC传感器,因此我无法使用它。
Dave Nottage发送了此link,但是找到的标头不能提供与PC / SC读卡器的有用连接。
制造商没有任何用于Android开发的SDK,因为他们仅将其用于PC(Linux,Windows和MacOS)。
面对这一点,直到现在,我仍无法成功连接和读写Android上的智能卡。