(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

