AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin
Thema durchsuchen
Ansicht
Themen-Optionen

Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin

Ein Thema von QuickAndDirty · begonnen am 26. Jan 2017 · letzter Beitrag vom 3. Feb 2017
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#1

Intent für BarcodeScan geht unter XE8 aber nicht unter Berlin

  Alt 26. Jan 2017, 17:30
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (26. Jan 2017 um 17:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 26. Jan 2017, 17:41
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 26. Jan 2017, 17:53
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (26. Jan 2017 um 18:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 26. Jan 2017, 18:58
Hilft Dir dieser Blog-Eintrag weiter?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 3. Feb 2017, 09:56
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 3. Feb 2017, 09:59
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 3. Feb 2017 um 10:37 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 3. Feb 2017, 11:49
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 3. Feb 2017, 12:45
Tja.
Es liegt wohl nicht am Barcode selbst. Es liegt am Wechsel in den Landscape-Mode.
Ich gucke mal wo das nun herkommt.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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