我正在Delphi上测试tethering。
Windows 10应用程序(无论是标准应用程序还是服务应用程序)都运行良好。在标准的android应用程序中,一切也都很好。
问题出在Android服务上。我可以从外部客户端连接到安卓服务中的tethering,接收和发送资源等。但是以下方法和事件不起作用:从客户端输出的连接(AutoConnect),OnEndManagersDiscovery,OnEndProfileDiscovery,OnNewManager不激发等。
我想不出为什么会发生这样的事情。
有谁知道bug在哪里吗?
发布于 2020-02-09 17:21:54
我无法做到这一点,所以我详细检查了System.Tether.Manager的源代码(System.Tether.AppProfile也是如此),很可能我找到了问题的原因。
执行TetheringManager.DiscoverManagers命令时,不会发生任何事件,但如果在此命令之后执行TetheringManager.RemoteManagers语句,则会列出周围的所有设备。
问题是该库使用TThread.Synchronize函数来同步事件。此功能需要一个主UI线程才能实现其功能。此功能没有android服务。因此,事件更新每次都会失败(例如,onEndManagersDiscovery)。该库不打算在android服务中使用。
procedure TTetheringManager.DoEndManagersDiscovery(const ARemoteManagers: TTetheringManagerInfoList);
begin
RegisterManagers(ARemoteManagers);
if Assigned(FOnEndManagersDiscovery) then
begin
if SynchronizeEvents then
TThread.Synchronize(nil,
procedure
begin
FOnEndManagersDiscovery(Self, ARemoteManagers);
end)
else
FOnEndManagersDiscovery(Self, ARemoteManagers);
end
end;有趣的是,例如,OnRequestStorage事件之所以有效,是因为它直接使用FOnRequestStorage(Self,AStorage)而不是TThread.Synchronize来更新事件。
procedure TTetheringManager.DoRequestStorage(var AStorage: TTetheringCustomStorage);
begin
AStorage := nil;
if Assigned(FOnRequestStorage) then
FOnRequestStorage(Self, AStorage);
end;更新:现在我发现解决这个问题的最简单的方法是禁用booth和TetheringAppProfile的SynchroniyeEvents。
发布于 2020-04-28 08:07:33
如果在没有超时的情况下执行AutoConnect,则会触发EndofAutoConnect的事件!今天发现..。
https://stackoverflow.com/questions/60132629
复制相似问题