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



我有一个Sunmi L2s设备,我正试图通过广播接收到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.

我看到的一个问题可能会导致您的"外部异常";错误是,在HandleIntentAction()中,Data.getAction()可能会返回nil,而您并没有检查它。此外,您需要比较完整的操作名称,而不是其前缀。

更改此项:

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(),直接在Form的OnCreate事件中处理StartupIntent

这篇文章有点旧,但可能你查询的是错误的密钥"Data"而不是"Data",这似乎是sunmi设备的正确默认密钥:

JStr := Data.getStringExtra(StringToJString('Data'));

用替换

JStr := Data.getStringExtra(StringToJString('data'));

最新更新