我正在Delphi上测试网络共享。
一切都可以在Windows 10应用程序(标准应用程序和服务)中正常运行。 在标准的android应用中,一切都还不错。
问题在Android服务中。我可以从外部客户端连接到android服务中的网络共享,接收和发送资源等。但是以下方法和事件不起作用:从客户端连接(AutoConnect),OnEndManagersDiscovery,OnEndProfileDiscovery,OnNewManager不触发等。 / p>
我不知道发生这种情况的任何原因...
任何人都不知道错误可能在哪里?
答案 0 :(得分:0)
我无法这样做,所以我详细检查了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;
更新:现在,我发现解决此问题的最简单方法是为展位TetheringManager和TetheringAppProfile禁用SynchroniyeEvents。
答案 1 :(得分:0)
如果您执行无超时的自动连接,则触发EndofAutoConnect事件!发现今天...