Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
ZXing Barkod Okuma
#1
Merhaba,

ZXing ile barkod okutuyorum.Android telefonda okunan barkodu "showmessage" ile göstermek istiyorum.Ancak mesaj kutusu açılınca arka planda çalışmakta olan kamera
ağırlaşıyor.Benzer durum kamera okuma yaparken başka forma geçiş yapıldığında da oluşuyor. Thread ile alakalı olabileceğini düşünüyorum ancak çözüm bulamadım.Bu konu hakkında tecrübesi olan arkadaşların desteğini rica ediyorum.
Cevapla
#2
(19-05-2021, Saat: 16:32)eyalin Adlı Kullanıcıdan Alıntı: Merhaba,

ZXing ile barkod okutuyorum.Android telefonda okunan barkodu "showmessage" ile göstermek istiyorum.Ancak mesaj kutusu açılınca arka planda çalışmakta olan kamera
ağırlaşıyor.Benzer durum kamera okuma yaparken başka forma geçiş yapıldığında da oluşuyor. Thread ile alakalı olabileceğini düşünüyorum ancak çözüm bulamadım.Bu konu hakkında tecrübesi olan arkadaşların desteğini rica ediyorum.

Öncelikle sorun yaşadığınızı belirttiğiniz kodları paylaşırsanız çözüm adına daha somut bir netice elde edebilirsiniz...

Benim yıllardır kullandığım ve hiçbir sorun yaşamadığım kodlar şu şekilde;

unit Android.QRCode;
{- Unit Info----------------------------------------------------------------------------
Unit Name  : Android.QRCode
Created By : Barış Atalay 26/02/2014  14:42
Last Change By :

Notes:
----------------------------------------------------------------------------------------}

interface
{$IF DEFINED(ANDROID)}
uses

 System.SysUtils,
 System.Classes,
 System.RTTI,
 FMX.Helpers.Android,
 AndroidAPI.JNI.Net,
 Androidapi.Jni.GraphicsContentViewText,
 Androidapi.JNI.JavaTypes,
 FMX.Platform,
 FMX.Platform.Android,
 AndroidAPI.Helpers;

type

 TCodeModes = (cmPRODUCT_MODE, cmQR_CODE_MODE, cmSCAN_MODE);

 TQRCodeEvent = reference to procedure(const Str: String);
 TQRCode = class
 private
   FClipboardService: IFMXClipboardService;
   FClipboardValue: TValue;
   FZXingCalled: Boolean;
   FOnScan: TQRCodeEvent;
   LFMXApplicationEventService: IFMXApplicationEventService;
   procedure ClipboardSave;
   function HandleAppEventCallBack(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;

   function GetZXingIntent: JIntent;
   procedure ClipboardBack;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Scan(const ACodeMode: TCodeModes; CallBack: TQRCodeEvent);
   property Scanning: Boolean read FZXingCalled write FZXingCalled;
 end;

const
 CodeModes: array[TCodeModes] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');
{$endif}

implementation

{$IF DEFINED(ANDROID)}
{ TQRCode }

procedure TQRCode.Scan(const ACodeMode: TCodeModes; CallBack: TQRCodeEvent);
var
 LIntent: JIntent;
begin
 FOnScan := CallBack;
 ClipboardSave;
 FClipboardService.SetClipboard('');
 LIntent := GetZXingIntent();
 LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(CodeModes[ACodeMode]));
 SharedActivity.startActivityForResult(LIntent, 0);
 FZXingCalled := True;
end;

procedure TQRCode.ClipboardSave;
begin
 FClipboardValue := FClipboardService.GetClipboard;
end;

constructor TQRCode.Create;
begin
 if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(LFMXApplicationEventService)) then
    LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEventCallBack);

 TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
      IInterface(FClipboardService));
end;

destructor TQRCode.Destroy;
begin
 inherited;
end;

function TQRCode.GetZXingIntent: JIntent;
const
 GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';
 GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';
begin
 Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));
 Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));
end;


function TQRCode.HandleAppEventCallBack(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
var
 LResult: string;
begin
 if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then
 begin
   LResult := FClipboardService.GetClipboard.ToString;
   if not LResult.IsEmpty and Assigned(FOnScan) then
   begin
      FOnScan(LResult);
      FOnScan := Nil;
   end;
   ClipboardBack;
   FZXingCalled := False;
 end;
 Result := True;
end;

procedure TQRCode.ClipboardBack;
begin
 FClipboardService.SetClipboard(FClipboardValue);
end;

{$ENDIF}

end.


Okutmak için Button'un OnClick'ine;

procedure TForm1.SpeedButton44Click(Sender: TObject); // Barkod Okut !!!


begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
//İlk gönderilen parametre hangi Tür kod okutacağınızdır. Seçenekler:
//cmPRODUCT_MODE, cmQR_CODE_MODE, cmSCAN_MODE

 QRCodeScanner.Scan(cmPRODUCT_MODE, procedure(const Str: String)
 begin
   TThread.Synchronize(TThread.CurrentThread, procedure
   begin
     Edit16.Text := Str;

   end);
 end);

 {$ENDIF}

end;
Ne ekersen onu biçersin!  Idea
Cevapla
#3
Cevap için teşekkürler kodlar aşağıda, barkodu okuyor mesaj olarak gösteriyor.Devamında image içindeki görüntü akışı ağırlaşıyor.Kodlar standart örnekteki kodlar.

procedure TMainForm.CameraComponent1SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin

 TThread.Synchronize(TThread.CurrentThread,
 procedure
 begin
   CameraComponent1.SampleBufferToBitmap(imgCamera.Bitmap, True);

   if (fScanInProgress) then
   begin
     exit;
   end;

   { This code will take every 4 frame. }
   inc(fFrameTake);
   if (fFrameTake mod 4 <> 0) then
   begin
     exit;
   end;

   if Assigned(fScanBitmap) then
     FreeAndNil(fScanBitmap);

   fScanBitmap := TBitmap.Create();
   fScanBitmap.Assign(imgCamera.Bitmap);

   ParseImage();
 end);


end;

procedure TMainForm.ParseImage();
begin

 TThread.CreateAnonymousThread(
   procedure
   var
     ReadResult: TReadResult;
     ScanManager: TScanManager;

   begin
     try
       fScanInProgress := True;
       ScanManager := TScanManager.Create(TBarcodeFormat.EAN_13, nil);  // ean13 seçtik

       try

         ReadResult := ScanManager.Scan(fScanBitmap);

       except
         on E: Exception do
         begin

           TThread.Synchronize(TThread.CurrentThread,
             procedure
             begin
               lblScanStatus.Text := E.Message;
             end);

           exit;
         end;

       end;

       TThread.Synchronize(TThread.CurrentThread,
         procedure
         begin

           if (Length(lblScanStatus.Text) > 10) then
           begin
             lblScanStatus.Text := '-';
           end;

           lblScanStatus.Text := lblScanStatus.Text + '-';
           if (ReadResult <> nil) then
           begin

             if buldum =0 then
             begin
              ShowMessage(ReadResult.Text);
        
             end;




           end;

         end);

     finally
       if ReadResult <> nil then
         FreeAndNil(ReadResult);

       ScanManager.Free;
       fScanInProgress := false;


     end;

   end).Start();

end;
Cevapla
#4
Konu günceldir.
Cevapla
#5
(19-05-2021, Saat: 22:00)tmrksmt Adlı Kullanıcıdan Alıntı:
(19-05-2021, Saat: 16:32)eyalin Adlı Kullanıcıdan Alıntı: Merhaba,

ZXing ile barkod okutuyorum.Android telefonda okunan barkodu "showmessage" ile göstermek istiyorum.Ancak mesaj kutusu açılınca arka planda çalışmakta olan kamera
ağırlaşıyor.Benzer durum kamera okuma yaparken başka forma geçiş yapıldığında da oluşuyor. Thread ile alakalı olabileceğini düşünüyorum ancak çözüm bulamadım.Bu konu hakkında tecrübesi olan arkadaşların desteğini rica ediyorum.

Öncelikle sorun yaşadığınızı belirttiğiniz kodları paylaşırsanız çözüm adına daha somut bir netice elde edebilirsiniz...

Benim yıllardır kullandığım ve hiçbir sorun yaşamadığım kodlar şu şekilde;

unit Android.QRCode;
{- Unit Info----------------------------------------------------------------------------
Unit Name  : Android.QRCode
Created By : Barış Atalay 26/02/2014  14:42
Last Change By :

Notes:
----------------------------------------------------------------------------------------}

interface
{$IF DEFINED(ANDROID)}
uses

 System.SysUtils,
 System.Classes,
 System.RTTI,
 FMX.Helpers.Android,
 AndroidAPI.JNI.Net,
 Androidapi.Jni.GraphicsContentViewText,
 Androidapi.JNI.JavaTypes,
 FMX.Platform,
 FMX.Platform.Android,
 AndroidAPI.Helpers;

type

 TCodeModes = (cmPRODUCT_MODE, cmQR_CODE_MODE, cmSCAN_MODE);

 TQRCodeEvent = reference to procedure(const Str: String);
 TQRCode = class
 private
   FClipboardService: IFMXClipboardService;
   FClipboardValue: TValue;
   FZXingCalled: Boolean;
   FOnScan: TQRCodeEvent;
   LFMXApplicationEventService: IFMXApplicationEventService;
   procedure ClipboardSave;
   function HandleAppEventCallBack(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;

   function GetZXingIntent: JIntent;
   procedure ClipboardBack;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Scan(const ACodeMode: TCodeModes; CallBack: TQRCodeEvent);
   property Scanning: Boolean read FZXingCalled write FZXingCalled;
 end;

const
 CodeModes: array[TCodeModes] of string = ('PRODUCT_MODE', 'QR_CODE_MODE', 'SCAN_MODE');
{$endif}

implementation

{$IF DEFINED(ANDROID)}
{ TQRCode }

procedure TQRCode.Scan(const ACodeMode: TCodeModes; CallBack: TQRCodeEvent);
var
 LIntent: JIntent;
begin
 FOnScan := CallBack;
 ClipboardSave;
 FClipboardService.SetClipboard('');
 LIntent := GetZXingIntent();
 LIntent.putExtra(StringToJString('SCAN_MODE'), StringToJString(CodeModes[ACodeMode]));
 SharedActivity.startActivityForResult(LIntent, 0);
 FZXingCalled := True;
end;

procedure TQRCode.ClipboardSave;
begin
 FClipboardValue := FClipboardService.GetClipboard;
end;

constructor TQRCode.Create;
begin
 if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(LFMXApplicationEventService)) then
    LFMXApplicationEventService.SetApplicationEventHandler(HandleAppEventCallBack);

 TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
      IInterface(FClipboardService));
end;

destructor TQRCode.Destroy;
begin
 inherited;
end;

function TQRCode.GetZXingIntent: JIntent;
const
 GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';
 GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';
begin
 Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING));
 Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE));
end;


function TQRCode.HandleAppEventCallBack(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
var
 LResult: string;
begin
 if FZXingCalled and (AAppEvent = TApplicationEvent.aeBecameActive) then
 begin
   LResult := FClipboardService.GetClipboard.ToString;
   if not LResult.IsEmpty and Assigned(FOnScan) then
   begin
      FOnScan(LResult);
      FOnScan := Nil;
   end;
   ClipboardBack;
   FZXingCalled := False;
 end;
 Result := True;
end;

procedure TQRCode.ClipboardBack;
begin
 FClipboardService.SetClipboard(FClipboardValue);
end;

{$ENDIF}

end.


Okutmak için Button'un OnClick'ine;

procedure TForm1.SpeedButton44Click(Sender: TObject); // Barkod Okut !!!


begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
//İlk gönderilen parametre hangi Tür kod okutacağınızdır. Seçenekler:
//cmPRODUCT_MODE, cmQR_CODE_MODE, cmSCAN_MODE

 QRCodeScanner.Scan(cmPRODUCT_MODE, procedure(const Str: String)
 begin
   TThread.Synchronize(TThread.CurrentThread, procedure
   begin
     Edit16.Text := Str;

   end);
 end);

 {$ENDIF}

end;

Hocam kod için teşekkür ederim....

herşey normal ancak 
  Edit16.Text := Str; ile str boş geliyor..
ancak Debug modda str değeri geliyor
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  FMX Android Barkod Scanner - [ÇÖZÜLDÜ] Mesut 21 2.378 20-12-2023, Saat: 21:46
Son Yorum: Jakarta2
  elterminali üzerinde androidde barkod uygulaması için action butonu yakalamak miralaymir 7 1.060 13-10-2023, Saat: 14:44
Son Yorum: miralaymir
  Mobil cihazda barkod ? cemakkus 13 3.085 02-11-2022, Saat: 13:43
Son Yorum: RAD Coder
  Hizmet olarak http den değer okuma CesuR 8 1.594 03-02-2022, Saat: 12:23
Son Yorum: CesuR
  El Terminallerinde barkod okuyucuları duraklatma / kapatma eneseto 5 2.154 14-12-2021, Saat: 17:32
Son Yorum: caoster



Konuyu Okuyanlar: 1 Ziyaretçi