Yorumları: 3
Konuları: 1
Kayıt Tarihi: 05-03-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 0 Başlangıç
19-05-2021, Saat: 16:32
(Son Düzenleme: 19-05-2021, Saat: 16:37, Düzenleyen: eyalin.)
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.
Yorumları: 106
Konuları: 13
Kayıt Tarihi: 23-09-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 308 Acemi
19-05-2021, Saat: 22:00
(Son Düzenleme: 19-05-2021, Saat: 22:36, Düzenleyen: tmrksmt.)
(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!
Yorumları: 3
Konuları: 1
Kayıt Tarihi: 05-03-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 0 Başlangıç
22-05-2021, Saat: 12:16
(Son Düzenleme: 22-05-2021, Saat: 12:45, Düzenleyen: eyalin.)
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;
Yorumları: 3
Konuları: 1
Kayıt Tarihi: 05-03-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 0 Başlangıç
Yorumları: 185
Konuları: 67
Kayıt Tarihi: 20-09-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 164 Başlangıç
12-06-2021, Saat: 12:47
(Son Düzenleme: 12-06-2021, Saat: 13:01, Düzenleyen: ikurt07.
Sebep: .
)
(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
|