Delphi 10.4,通过条形码扫描仪广播接收输出结果

tjvv9vkg  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(238)

我有一台Sunmi L2 s设备,我正尝试通过广播接收条形码扫描结果并发送到Android应用程序。我想创建一个应用程序,当我按下硬件扫描按钮(手机侧面的橙子按钮)时,该应用程序会在应用程序中的TLabel.Text上显示条形码。
我在StackOverflow上找到了代码,但我无法让它接收结果,并且当应用程序启动时,我收到一条消息,显示“外部异常0”。
我是新的 Delphi /Android开发,所以任何帮助都是欢迎的!

implementation

{$R *.fmx}

uses
  FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net,  
  Androidapi.JNI.Os, Androidapi.Helpers;

procedure TForm4.FormCreate(Sender: TObject);
var
  AppEventService: IFMXApplicationEventService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, AppEventService) then
    AppEventService.SetApplicationEventHandler(HandleAppEvent);

  MainActivity.registerIntentAction(StringToJString('com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED'));
  TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleActivityMessage);
end;

procedure TForm4.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
  if M is TMessageReceivedNotification then
    HandleIntentAction(TMessageReceivedNotification(M).Value);
end;

function TForm4.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
var
  StartupIntent: JIntent;
begin
  Result := False;
  if AAppEvent = TApplicationEvent.BecameActive then
  begin
    StartupIntent := MainActivity.getIntent;
    if StartupIntent <> nil then
      HandleIntentAction(StartupIntent);
  end;
end;

function TForm4.HandleIntentAction(const Data: JIntent): Boolean;
var
  JStr: JString;
begin
  Result := False;
  if (Data <> nil) and Data.getAction.equals(StringToJString('com.sunmi.scanner')) then
  begin
    JStr := Data.getStringExtra(StringToJString('Data'));
    Label1.Text := JStringToString(JStr);
    Invalidate;
  end;
end;

end.
agyaoht7

agyaoht71#

我看到的一个可能导致“外部异常”错误的问题是,在HandleIntentAction()中,Data.getAction()can potentially return nil,您没有检查它。此外,您需要比较 complete 操作名称,而不是它的前缀。
更改此项:

Data.getAction.equals(StringToJString('com.sunmi.scanner'))

改为:

StringToJString('com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED').equals(Data.getAction)

除此之外,我看到的另一个潜在问题是HandleAppEvent(),你确定BecameActive是处理StartupIntent的最佳事件吗?我认为FinishedLaunching是更合适的事件。一个应用在其生存期内可以多次获得和失去焦点,所以你不想一遍又一遍地处理同一个启动Intent对象。否则,至少,在处理完StartupIntent之后,您可以选择调用MainActivity.setIntent(nil),这样MainActivity.getIntent()就不会在后续事件中返回相同的Intent对象。或者,您可以简单地去掉HandleAppEvent(),而直接在窗体的OnCreate事件中处理StartupIntent

相关问题