Benten Posted July 9, 2022 Posted July 9, 2022 Добрый день, уважаемые разработчики. Решил адаптировать подключение к удаленному сервису Андроид на базе стандартного примера 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
Benten Posted July 9, 2022 Author Posted July 9, 2022 Если импортировать сервис непосредственно в приложение FGX, как показано на скриншоте, сервис вообще не работает Подскажите, пожалуйста, что надо сделать, чтобы сервис работал прямо из fgx приложения?
Benten Posted July 11, 2022 Author Posted July 11, 2022 Ярослав, есть мысли, почему unBindService приводит к зависанию приложения?
Administrators Yaroslav Brovin Posted July 11, 2022 Administrators Posted July 11, 2022 Добрый вечер, Изучаю проблему. У меня пока есть проблема со сборкой самого сервиса проекта. У меня используется другая версия делфи...
Administrators Yaroslav Brovin Posted July 11, 2022 Administrators Posted July 11, 2022 Пока из того, что вижу по коду. Андроид сервисы реализованы в Делфи не очень хорошо. В их реализации используется прямая зависимость на 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 Yaroslav Brovin Posted July 11, 2022 Administrators Posted July 11, 2022 У вас используется метод конвертации AndroidApi.Helpers.StringToJString, а его в "Android.Api.RTLBridgeCompatibility" нету. Я добавил необходимые методы в Android.Api.RTLBridgeCompatibility.pas Добавьте этот файл к вашему проекту приложения и уберите "Androidapi.Helpers" из секции uses.
Benten Posted July 12, 2022 Author Posted July 12, 2022 Добрый день! Ярослав, вот такой развернутый ответ, в виде видео https://cloud.mail.ru/public/3p2z/YUoTanurR и лог во вложении device_full.txt 1
Administrators Yaroslav Brovin Posted July 12, 2022 Administrators Posted July 12, 2022 Добрый вечер @Benten, Сегодня наконец-то удалось собрать сервис и все проверить. Спойлер, у меня все заработало. Однако: В прикрепленном демо-проекте неверно указано название класса в связи к сервису. Должно быть так: procedure TFormMain.ButtonBindTap(Sender: TObject); begin FServiceConnection.BindService('ru.galion.fgxremoteexternal', 'com.embarcadero.services.RemoteService'); end; Сервис обязательно нужно добавить через мастер Андроид сервисов FGX Native. Я прикрепил новый проект, проверяйте. Проверил на разных версиях Андроида, все работает как надо и без ошибок. RemoteServiceDemo.zip
Benten Posted July 13, 2022 Author Posted July 13, 2022 Добрый день, Ярослав! Шлю вам очередное видеопослание, уж извините за настойчивость. RemoteService_AV_2.mp4
Administrators Yaroslav Brovin Posted July 13, 2022 Administrators Posted July 13, 2022 Добрый день, 1. Проблема сборки сервиса Чтобы собрался сервис, скорее всего нужна новая версия Java JDK. Я использую 18 версию, возможно в этом дело. После установки новой Java JDK обязательно перезапустить IDE и убедитесь, что среда ее подцепила. Это можно понять из вывода в окне Messages. Обратите внимание на команду сборки jar, а именно на версию JDK. Если версия не корректная, надо обновить: Переменные окружения $(JAVA_HOME) и $(PATH) Обязательно обновить пути к джаве в IDE Android SDK Profile: Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку. Если это не помогает, то нужно проверить используемую версию Android SDK. У меня используется 31 версия. 2. Краш на Unbind Какую версию Андроид вы используете? Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида?
Benten Posted July 13, 2022 Author Posted July 13, 2022 1 час назад, Yaroslav Brovin сказал: 2. Краш на Unbind Какую версию Андроид вы используете? Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида? Пробую на разных версиях Андроид и разных устройствах: Смарт-терминал MSPOS - Андроид 6 Xiomi Redmi 4A - Андроид 6 Эмулятор - Андроид 7 Планшет HUAWEI Андроид 8 Xiomi Mi9T Pro - Android 10 Эмулятор в видео показан только для наглядности, ошибка везде одинаковая. Проблему с версиями SDK, NDK, JDK я исключаю потому что проект FMX работает корректно Или я не прав?
Benten Posted July 13, 2022 Author Posted July 13, 2022 1 час назад, Yaroslav Brovin сказал: Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку. Это помогло, спасибо
Administrators Yaroslav Brovin Posted July 13, 2022 Administrators Posted July 13, 2022 Исправлено в 1.14.3.2.
Recommended Posts