Delphi Can

Orjinalini görmek için tıklayınız: PDA el terminalinde okunan barkodu alma
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Arkadaslar merhaba,

Perkon'un uzerinde kendi barkod tarayicisi olan DS2 el terminaline barkod okutmak istiyorum (http://www.perkon.com.tr/tr-TR/ds2/3/15/753/2904/0/0)
aciklamalarda

data receive method : INDENT_EVENT
Action name : app.dsic.barcodetray.BARCODE_BR_DECODING_DATA


denmis. Ben de düz mantikla Delphi 10.2 Tokyo örnekleri icindeki "receive indent" uygulamasinda

MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW);

satirini

MainActivity.registerIntentAction(StringtojString('app.dsic.barcodetray.BARCODE_BR_DECODING_DATA'));

olarak degistirdim ve AndroidManifest.template.xml dosyasi icinde ACTION_VIEW ile ilgili olan indent-filter tagi icini 

<action android:name="app.dsic.barcodetray.BARCODE_BR_DECODING_DATA" />

olarak degistirdim...
Ve tabi ki de çalismiyor Big Grin  hayat bu kadar kolay olsaydi keske... 2 gündür googella, forumlari tirmala ihhh, kimse gercek bir barkod okuyucu ile barkod okutmaya caslismamis yada yapmis da deneyimini paylasmamis, Her taraf Xing ornekleri ile dolu.

Şu intenti bir ele gecirsem, daha başlangicta takilip kaldim. Varsa bir yardim lutfen..

Alet barkod okuduktan sonra bir broadcast yayinliyor. Burada gonderdigi intent icindeki action name " app.dsic.barcodetray.BARCODE_BR_DECODING_DATA".
Benim bunu bir sekilde form icinde yakalayabilmem lazim. cihazin kendi orneginde java ile Broadcastreceiver fonksiyonu yazmis ve bu fonksiyonu asagidaki satirla kayit etmis.

registerReceiver(mBarcodeReadBroadCast , new IntentFilter("app.dsic.barcodetray.BARCODE_BR_DECODING_DATA"));

Delphi intent ornegindeki HandleActivityMessage proseduru muhtemelen ayni amacla calisiyor. Programi debug modda adim adim calistiryorum, FormCreate den sonra diger prosedurlerin icine baslangicta bir kac kez dusuyor ama daha sonra barkod okuttugumda hic bir break-point de yakalanmiyor. yani proses formun icinde düşmüyor.

Ilgili kodun tamamini asagiya kopyalasam sanırım ilgilenmek isteyeceklere hem daha fazla ip ucu verecek hem de ornegi aratmamis olacagim:

unit Unit1;

interface

uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Messaging, FMX.Platform,
 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, Androidapi.JNI.GraphicsContentViewText,
 FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.WebBrowser, FMX.Objects, FMX.ScrollBox, FMX.Memo;

type
 TForm1 = class(TForm)
   ToolBar1: TToolBar;
   Layout1: TLayout;
   Memo1: TMemo;
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
   procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
   function HandleIntentAction(const Data: JIntent): Boolean;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.fmx}

uses FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.Helpers;

procedure TForm1.FormCreate(Sender: TObject);
var
 AppEventService: IFMXApplicationEventService;
begin

 if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, AppEventService) then
   AppEventService.SetApplicationEventHandler(HandleAppEvent);

 // Register the type of intent action that we want to be able to receive.
 // Note: A corresponding <action> tag must also exist in the <intent-filter> section of AndroidManifest.template.xml.

//  MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW);

 MainActivity.registerIntentAction(StringtojString('app.dsic.barcodetray.BARCODE_BR_DECODING_DATA'));

 TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleActivityMessage);
end;

procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
 if M is TMessageReceivedNotification then
   HandleIntentAction(TMessageReceivedNotification(M).Value);
end;

function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
var
 StartupIntent: JIntent;
begin
 Result := False;
 if AAppEvent = TApplicationEvent.BecameActive then
 begin
   StartupIntent := MainActivity.getIntent;
   if StartupIntent <> nil then
     HandleIntentAction(StartupIntent);
 end;
end;

function TForm1.HandleIntentAction(const Data: JIntent): Boolean;
var
 Extras: JBundle;
begin
 Result := False;
 if Data <> nil then
 begin
   Memo1.ClearContent;
   Extras := Data.getExtras;
   if Extras <> nil then
     Memo1.Text := JStringToString(Extras.getString(TJIntent.JavaClass.EXTRA_TEXT));
   Invalidate;
 end;
end;

end.
Arkadaslar asagidaki broadcastreceiver ile soruma cevap buldum. Yine de yukaridaki kodun neden calismadigina ya da ne eklenir/cikartilirsa calisabilecegine dair bir cevap varsa kodu geliştirmek adına bilmek isterim.

tesekkurler, cem

unit BroadcastReceiverU;

interface

uses
 Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText;

type
 TMyReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
 public
   procedure onReceive(context: JContext; intent: JIntent); cdecl;
 end;

implementation

uses
 Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Widget;

procedure TMyReceiver.onReceive(context: JContext; intent: JIntent);
var
BarcodeText: string;
begin
   BarcodeText := JStringToString(intent.getStringExtra(StringToJString('EXTRA_BARCODE_DECODED_DATA')));
end;

end.