Android服务上的Delphi网络共享

时间:2020-02-09 00:57:09

标签: android delphi delphi-10.3-rio tethering

我正在Delphi上测试网络共享。

一切都可以在Windows 10应用程序(标准应用程序和服务)中正常运行。 在标准的android应用中,一切都还不错。

问题在Android服务中。我可以从外部客户端连接到android服务中的网络共享,接收和发送资源等。但是以下方法和事件不起作用:从客户端连接(AutoConnect),OnEndManagersDiscovery,OnEndProfileDiscovery,OnNewManager不触发等。 / p>

我不知道发生这种情况的任何原因...

任何人都不知道错误可能在哪里?

2 个答案:

答案 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事件!发现今天...