![]() |
Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Hallo ich benutze folgenden Code aus dem Internet zum Scannen von Barcodes.
Seltsamer Weise kommt er nie in der Methode "HandleActivityMessage" an. Statt dessen scheint es so als würde meine App beendet und neugestartet. Habt ihr eine Idee was man machen muss, damit das mit Delphi Berlin unter Android 4.1.2 läuft?
Delphi-Quellcode:
unit uBarcodeScannerIntent;
interface Uses FMX.platform, {$IFDEF ANDROID} fmx.helpers.android, androidapi.JNI.GraphicsContentViewText, androidapi.jni.JavaTypes, androidapi.helpers,androidapi.jni.App, {$ENDIF} classes,types,FMX.types, system.Messaging; type TBarcodeScannerIntent = class(TComponent) private fbarcode: String; fOnBarcodeScanned: TNotifyevent; fOnScanCanceled: TNotifyevent; fCodeType: String; fBarcodeFormat: String; const SCAN_REQUEST_CODE = 0; var FMessageSubscriptionID: Integer; procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); {$IFDEF ANDROID} function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; {$ENDIF} public Constructor Create(aOwner : TComponent);Override; Procedure Scan; Property CodeType:String read fCodeType write fCodetype; property Barcode:String read fbarcode; property BarcodeFormat:String read fBarcodeFormat Write fBarcodeFormat; property OnBarcodeScanned:TNotifyevent read fOnBarcodeScanned write fOnbarcodescanned; property OnScanCanceled:TNotifyevent read fOnScanCanceled write fOnScanCanceled; end; implementation { TBarcodeScannerIntent } constructor TBarcodeScannerIntent.create(aOwner: TComponent); begin inherited; fCodetype := ''; fbarcode := ''; fBarcodeFormat := ''; end; procedure TBarcodeScannerIntent.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin {$IFDEF ANDROID} if M is TMessageResultNotification then OnActivityResult( TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode, TMessageResultNotification(M).Value); {$ENDIF} end; {$IFDEF ANDROID} function TBarcodeScannerIntent.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; var LScanContent, LScanFormat: string; begin Result := False; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; if RequestCode = SCAN_REQUEST_CODE then begin if ResultCode = TJActivity.JavaClass.RESULT_OK then begin Result := True; if Assigned(Data) then begin LScanContent := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT'))); LScanFormat := JStringToString(Data.getStringExtra(StringToJString('SCAN_RESULT_FORMAT'))); TThread.Synchronize(nil, procedure begin fbarcode := LScanContent; fBarcodeFormat := LScanFormat; if assigned(fOnBarcodeScanned) then fonbarcodescanned(self); end ); end; end else Begin fbarcode := ''; fBarcodeFormat := ''; if assigned(fOnScanCanceled) then fOnScanCanceled(self); end; end; end; {$ENDIF} procedure TBarcodeScannerIntent.Scan; {$IFDEF ANDROID} var intent: jintent; {$ENDIF} begin {$IFDEF ANDROID} // Callback registrieren FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage); fBarcodeFormat := ''; fbarcode:= ''; Intent := TJIntent.JavaClass.init(StringToJString('com.google.zxing.client.android.SCAN')); Intent.setPackage(StringToJString('com.google.zxing.client.android')); if fCodetype <> '' then intent.putExtra(stringtojstring('SCAN_MODE'),stringtojstring(fCodetype)); sharedactivity.startActivityForResult(intent,SCAN_REQUEST_CODE); {$ENDIF} end; end. |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Hast du mal geschaut, ob sich nicht vielleicht die Parameter von HandleActivityMessage geändert haben?
Nee, wird per Code und nicht über den OI zugewiesen ... da sollte der Compiler ja meckern. |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Zitat:
Es hat sich ja nicht die APP zum Scannen geändert nur die IDE.... Quasi Der Crash muss aber irgendwie mit der registrierten Callback-Methode zusammen hängen , denn genau wenn eigentlich eben diese aufgerufen werden sollte, wird die App beendet und neugestartet. hm kann auch an den "touchanimationen" der Buttons liegen.. hab den intent mal im onIdle gestartet... von da aus kehrt er zurück! Ist das logisch? |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Hilft Dir dieser
![]() |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Ich hoffe.
denn wie ich gerade vom Kunden erfahren habe tritt dort das Problem noch auf. Und ich kann es auch hier auf einmal wieder reproduzieren...warum auch immer. der Call Back wird vom intent nicht aufgerufen, stattdessen wird die App neugestartet. Verrückt. Warum ging das in XE8 und in Berlin nicht mehr? |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Zitat:
Seine Beispiele sind im prinzip wie meines. Mit der ausnahme das er innerhalb der callback methode Thread.Queue verwendet. Aber so weit komme ich ja schon nicht. die Callback methode wird einfach nicht aufgerufen. zumindest nicht der breakpoint an ihrem anfang. |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Lustig in der App funktioniert der obige code
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, uBarcodeScannerIntent, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } Scanner:TBarcodeScannerIntent; Procedure OnBarcodeScanned(Sender:TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin Scanner.scan; end; procedure TForm1.FormCreate(Sender: TObject); begin Scanner := TBarcodeScannerIntent.Create(self); Scanner.OnBarcodeScanned := OnBarcodeScanned; end; procedure TForm1.OnBarcodeScanned(Sender: TObject); begin Memo1.Lines.insert(0,Scanner.Barcode); end; |
AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Tja.
Es liegt wohl nicht am Barcode selbst. Es liegt am Wechsel in den Landscape-Mode. Ich gucke mal wo das nun herkommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz