Привязка Delphi к службе Android

Я тестирую модем на Delphi.

Все хорошо работает в приложениях Windows 10 (как стандартное приложение, так и сервис). В стандартном андроид-приложении тоже все нормально.

Проблемы в сервисе Android. Я могу подключиться от внешнего клиента к привязке в службе Android, получать и отправлять ресурсы и т. д. Но следующие методы и события не работают: подключение от клиента (AutoConnect), OnEndManagersDiscovery, OnEndProfileDiscovery, OnNewManager не срабатывает и т. д..

Я не мог понять, почему это происходит...

У кого-нибудь есть идеи, где может быть ошибка?


person pudnivec74    schedule 09.02.2020    source источник
comment
Возможно разрешения. Какая версия Андроида? Используйте средство просмотра logcat, чтобы увидеть, какие сообщения об ошибках возникают (если они есть). У меня есть один здесь: github.com/DelphiWorlds/DeviceLens   -  person Dave Nottage    schedule 09.02.2020
comment
Протестировано на Android 6.0, 8.0.0 и 9.0. Разрешения (ACCESS_NETWORK_STATE, READ_PHONE_STATE) выставлены (для службы - хотя и ненужные) как и для стандартного Android-приложения (которое отлично работает без проблем). Монитор устройства Android не сообщает об ошибках.   -  person pudnivec74    schedule 09.02.2020
comment
Объектив устройства (версия 1.1.0) также не сообщает об ошибках.   -  person pudnivec74    schedule 09.02.2020


Ответы (2)


У меня не получилось, поэтому я подробно изучил исходный код System.Tether.Manager (то же касается и System.Tether.AppProfile) и, скорее всего, нашел причину проблемы.

При выполнении команды TetheringManager.DiscoverManagers никаких событий не происходит, но если после этой команды выполняется инструкция TetheringManager.RemoteManagers, в список выводятся все окружающие устройства.

Проблема в том, что библиотека использует функцию TThread.Synchronize для синхронизации событий. Для этой функции требуется основной поток пользовательского интерфейса. Эта функция не имеет службы 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;

Обновление: Теперь я обнаружил, что самый простой способ решить эту проблему — отключить SynchroniyeEvents для стенда TetheringManager и TetheringAppProfile.

person pudnivec74    schedule 09.02.2020
comment
Библиотека не предназначена для использования в службе Android. Интересно, что это была моя первая догадка, когда я прочитал ваш вопрос ранее. - person nolaspeaker; 09.02.2020

если вы выполняете AutoConnect без тайм-аута, то событие для EndofAutoConnect запускается! обнаружил, что сегодня...

person GuruMeditationError    schedule 28.04.2020