Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin (https://www.delphipraxis.net/191548-intent-fuer-barcodescan-geht-unter-xe8-aber-nicht-unter-berlin.html)

QuickAndDirty 26. Jan 2017 17:30

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.

himitsu 26. Jan 2017 17:41

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.

QuickAndDirty 26. Jan 2017 17:53

AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
 
Zitat:

Zitat von himitsu (Beitrag 1360083)
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.

Hab die MessageParameter nachgesehen.
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?

DeddyH 26. Jan 2017 18:58

AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
 
Hilft Dir dieser Blog-Eintrag weiter?

QuickAndDirty 3. Feb 2017 09:56

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?

QuickAndDirty 3. Feb 2017 09:59

AW: Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
 
Zitat:

Zitat von DeddyH (Beitrag 1360087)
Hilft Dir dieser Blog-Eintrag weiter?

Ok sie haben also den ganzen scheiß geändert in Delphi Seatle und Berlin :(

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.

QuickAndDirty 3. Feb 2017 11:49

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;

QuickAndDirty 3. Feb 2017 12:45

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 09:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz