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

