我有一台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.
2条答案
按热度按时间agyaoht71#
我看到的一个可能导致“外部异常”错误的问题是,在
HandleIntentAction()
中,Data.getAction()
can potentially returnnil
,您没有检查它。此外,您需要比较 complete 操作名称,而不是它的前缀。更改此项:
改为:
除此之外,我看到的另一个潜在问题是
HandleAppEvent()
,你确定BecameActive
是处理StartupIntent
的最佳事件吗?我认为FinishedLaunching
是更合适的事件。一个应用在其生存期内可以多次获得和失去焦点,所以你不想一遍又一遍地处理同一个启动Intent
对象。否则,至少,在处理完StartupIntent
之后,您可以选择调用MainActivity.setIntent(nil)
,这样MainActivity.getIntent()
就不会在后续事件中返回相同的Intent
对象。或者,您可以简单地去掉HandleAppEvent()
,而直接在窗体的OnCreate
事件中处理StartupIntent
。