2014-07-09 19 views
11

Im mới với Firemonkey và Android và tôi không biết liệu tôi có cách tiếp cận sai hay không. Tôi muốn có một ứng dụng đang chạy và đọc Thẻ NFC.Bộ điều hợp NFC Android của Firemonkey

Có cách nào để sử dụng NFC Reader trong các thiết bị Android có đầu cháy không?

Với một phần của NFCAdapter từ FMXExpress (http://www.fmxexpress.com/full-android-sdk-interface-files-in-object-pascal-for-firemonkey/) tôi có thể xác định xem thiết bị có đầu đọc NFC và nếu thiết bị được bật hay không. Nhưng để sử dụng tất cả các chức năng, tôi phải định nghĩa tất cả các giao diện theo cách thủ công và giải quyết tất cả các tham chiếu vòng tròn. Tôi không nghĩ rằng điều này có thể dẫn đến một giải pháp prober.

Im đối mặt với những giải pháp để xây dựng JavaClass của riêng tôi để giao tiếp với bộ chuyển đổi nfc như nó được mô tả trong bài viết trên blog này: http://blong.com/Articles/DelphiXE5AndroidActivityResult/ActivityResult.htm#Building

+2

Nếu bạn vẫn còn bị mắc kẹt về điều này, @deterministicFail, tôi đã viết lên cách đọc và viết thẻ NFC trong ứng dụng Android Delphi cho XE5, XE6 và XE7. Bạn có thể tìm bài đăng có liên kết tới cả ba bài viết tại đây: http://blog.blong.com/2014/09/delphi-and-nfc-on-android.html Hãy tận hưởng! – blong

Trả lời

21

Có! Bạn đang dùng đúng cách.

Để làm Delphi và FireMonkey công việc bạn có thể sử dụng template sau đây vì nó là đúng cách để đạt được những gì bạn có trong tâm trí:

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 Bộ điều hợp:

/////////////////////////// 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)); 

Trong trường hợp bạn chơi xung quanh với mẫu mã này, tôi khá chắc chắn rằng nó sẽ làm việc! Tôi đoán, bạn buộc phải tận dụng tối đa mọi thứ, chẳng hạn như sử dụng API hoàn toàn chéo và đa nền tảng, điều đó sẽ cho phép bạn có chính xác mã tương tự chạy trên Android and iOS mà không có bất kỳ thay đổi nào về mặt trước của ứng dụng và back-end. Đúng, đúng là một số công cụ hiện đang được phát triển nhắm mục tiêu để giải quyết đa nền tảng thực sự nhúng development, mà sẽ đạt được tích hợp đầy đủ có thể trong tương lai gần. Thật không may, thực tế là ở giai đoạn phát triển nền tảng di động hiện tại, bạn chỉ có thể sử dụng các công cụ đa nền tảng như vậy nếu bạn đang triển khai nhiều ứng dụng cơ bản hơn sẽ không phụ thuộc vào nhiều tài nguyên cụ thể hơn, chẳng hạn như NFC, Geofencing, v.v. Tất nhiên, nếu bạn không ở trong một môi trường sản xuất, thì cuối cùng bạn có thể có tất cả thời gian để chơi và hacking xung quanh cho vui. Nhưng giả sử rằng không phải là trường hợp, sau đó tiếp tục tập trung vào việc đưa mọi thứ lại với nhau để làm việc nhanh, như thời hạn giao hàng thường là chặt chẽ.

Điều đó nói rằng, cách nhanh nhất và ngắn nhất để đạt được giao tiếp thẻ NFC chỉ đơn giản bằng cách thực hiện với tài nguyên API NFC Android, vì nó đã được giới thiệu kể từ API cấp 9 - Android Gingerbread.

enter image description here

chuyển NFC có thể xảy ra giữa hai thiết bị NFC cho phép, hoặc giữa một thiết bị và một “tag” NFC. Thẻ có thể nằm trong số các thẻ thụ động truyền URL khi được quét đến các hệ thống phức tạp như các thẻ được sử dụng trong các giải pháp thanh toán NFC, chẳng hạn như Google Wallet.

enter image description here

Để đọc, viết, hoặc phát sóng thông điệp NFC, ứng dụng của bạn yêu cầu NFC cho phép biểu hiện:

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

Khi một thiết bị Android được sử dụng để quét một thẻ NFC, hệ thống sẽ giải mã tải trọng đến bằng cách sử dụng hệ thống gửi thẻ của riêng nó, phân tích thẻ, phân loại dữ liệu và sử dụng Intent để khởi chạy ứng dụng để nhận dữ liệu.

Đây là một mã số ảnh chụp cho thấy làm thế nào để đăng ký một Hoạt động đó sẽ trả lời chỉ để NFC tags:

<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> 

Các NfcAdapter.EXTRA_TAG thêm bao gồm một đối tượng Tag liệu đại diện cho thẻ quét. Các NfcAdapter.EXTRA_TNDEF_MESSAGES thêm chứa một loạt các tin nhắn 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

các tiềm năng và khả năng của NFC applications là rất lớn, và nhu cầu về công nghệ như vậy có xu hướng phát triển đáng kể:

enter image description here

Nếu bạn có thể sử dụng điện thoại thông minh làm phương thức thanh toán, thì việc thanh toán cho những thứ như phương tiện công cộng và bãi đậu xe có thể đơn giản như swipin g điện thoại của bạn. Bạn thậm chí có thể nhấn vào thiết bị đầu cuối báo trên tuyến đường đi làm hàng ngày để tải xuống sự cố mới nhất cho thiết bị của mình.

+0

Cảm ơn bạn đã trả lời chi tiết. Thật không may im ràng buộc với delphi và firemonkey. – deterministicFail

+0

Cảm ơn bạn đã nỗ lực. Giao diện này là những gì tôi có nghĩa là trong câu hỏi của tôi, và là ví dụ delphi duy nhất trên mạng. Dựa trên nghiên cứu của tôi, tôi đi đến kết luận, rằng cách duy nhất đúng lúc này là thực hiện một JavaClass riêng và sử dụng nó từ Firemonkey. – deterministicFail

+0

cảm thấy tự do để viết trong trường hợp bạn tìm kiếm hỗ trợ thêm .... |: 0), – Avanz

Các vấn đề liên quan