Jump to content

Recommended Posts

Posted

Добрый день, уважаемые разработчики.

Решил адаптировать подключение к удаленному сервису Андроид на базе стандартного примера Firemonkey из Samples:

C:\Users\Public\Documents\Embarcadero\Studio\21.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\RemoteServiceDemo

Мое приложение находится в папке FGXRemoteApp. Подключение к сервису проходит на ура, обмен с сервисом тоже работает, а вот при отключении от сервиса, приложение зависает.

При этом, аналогичное FMX приложение из папки FMXRemoteApp работает корректно. Удаленный сервис RemoteService запускается через приложение AppRemoteHost

RemoteServiceDemo.7z

Posted

Если импортировать сервис непосредственно в приложение FGX, как показано на скриншоте, сервис вообще не работает

Подскажите, пожалуйста, что надо сделать, чтобы сервис работал прямо из fgx приложения?

img-2022-07-09-23-17-32.png

Posted

Ярослав, есть мысли, почему unBindService приводит к зависанию приложения?

  • Administrators
Posted

Добрый вечер,

Изучаю проблему. У меня пока есть проблема со сборкой самого сервиса проекта. У меня используется другая версия делфи... 

  • Administrators
Posted

Пока из того, что вижу по коду. Андроид сервисы реализованы в Делфи не очень хорошо. В их реализации используется прямая зависимость на FMX классы, что мы не можем просто поправить. По этой причине мы поставляем пропатченные готовые файлы:

  • System.Android.Service.dcu
  • System.Android.Service.o

По сути мы взяли исходный файл System.Android.Service.pas внесли изменения, чтобы этот файл работал корректно с FGX Native. Этот пропатченный файл автоматически добавляется в папку сборки FGX Native проекта (Android/$(Config)), только если в проект явно добавлен Андроид сервис через "Project" -> "FGX Android services".  

Если вы самостоятельно добавляете к проекту jar файл и через Deployment so-библиотеку сервиса, то приложение будет падать в те, моменты, когда для работы сервиса требуется TAndroidHelper.Activity

Если же вы добавляете сервис через "Project" -> "FGX Android services", то все должно быть хорошо. На самый крайний случай, вы можете скопировать упомянутые файлы выше прямо в корень проекта. Это гарантирует, что линковщик возьмет именно пропатченные версии этих файлов. Если у вас идет зависание проекта при отключении сервиса, то первое что нужно посмотреть:

  • Стек трейс, если есть.
  • Андроид лог.

Предположение

Из того, что вижу. В модуле FGX.RemoteService вы используете класс TAndroidHelper, который и является камнем преткновения в RTL, так как он зависит от FMX. Вы правильно добавили "Android.Api.RTLBridgeCompatibility", в нем переопределен этот класс хелпера. Однако, в FGX.RemoteService вы добавили еще Androidapi.Helpers, который в итоге переопределяет "Android.Api.RTLBridgeCompatibility". Поэтому для корректной работы "Android.Api.RTLBridgeCompatibility" должен быть последний среди всех подключений модуля, включая секцию реализации.

Чуть позже, как смогу собрать сервис, смогу и посмотреть ваш проект уже в живую.

  • Administrators
Posted

У вас используется метод конвертации AndroidApi.Helpers.StringToJString, а его в "Android.Api.RTLBridgeCompatibility" нету.

Я добавил необходимые методы в Android.Api.RTLBridgeCompatibility.pas

Добавьте этот файл к вашему проекту приложения и уберите "Androidapi.Helpers" из секции uses.

  • Administrators
Posted

Добрый вечер @Benten,

Сегодня наконец-то удалось собрать сервис и все проверить. Спойлер, у меня все заработало. Однако:

  1. В прикрепленном демо-проекте неверно указано название класса в связи к сервису. Должно быть так:
    procedure TFormMain.ButtonBindTap(Sender: TObject);
    begin
      FServiceConnection.BindService('ru.galion.fgxremoteexternal', 'com.embarcadero.services.RemoteService');
    end;
  2. Сервис обязательно нужно добавить через мастер Андроид сервисов FGX Native.

Я прикрепил новый проект, проверяйте. Проверил на разных версиях Андроида, все работает как надо и без ошибок.

RemoteServiceDemo.zip

  • Administrators
Posted

Добрый день,

1. Проблема сборки сервиса

Чтобы собрался сервис, скорее всего нужна новая версия Java JDK. Я использую 18 версию, возможно в этом дело. После установки новой Java JDK обязательно перезапустить IDE и убедитесь, что среда ее подцепила. Это можно понять из вывода в окне Messages. Обратите внимание на команду сборки jar, а именно на версию JDK.

image.png

Если версия не корректная, надо обновить:

  1. Переменные окружения $(JAVA_HOME) и $(PATH)
  2. Обязательно обновить пути к джаве в IDE Android SDK Profile:
    image.png

Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку.

Если это не помогает, то нужно проверить используемую версию Android SDK. У меня используется 31 версия.

2. Краш на Unbind

  • Какую версию Андроид вы используете?
  • Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида?
Posted
1 час назад, Yaroslav Brovin сказал:

2. Краш на Unbind

  • Какую версию Андроид вы используете?
  • Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида?

Пробую на разных версиях Андроид и разных устройствах:

  1. Смарт-терминал MSPOS - Андроид 6
  2. Xiomi Redmi 4A - Андроид 6
  3. Эмулятор - Андроид 7
  4. Планшет HUAWEI Андроид 8
  5. Xiomi Mi9T Pro - Android 10

Эмулятор в видео показан только для наглядности, ошибка везде одинаковая.

Проблему с версиями SDK, NDK, JDK я исключаю потому что проект FMX  работает корректно

Или я не прав?

Posted
1 час назад, Yaroslav Brovin сказал:

Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку.

Это помогло, спасибо 

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...