Russian Qt Forum
Ноябрь 23, 2024, 05:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QML + C++ + Android  (Прочитано 25530 раз)
carrygun
Гость
« Ответ #15 : Январь 12, 2015, 07:17 »

Всем привет, с наступившим!

Продолжу вести свой "блог" с Qt и Android.

Во-первых спасибо за Settings, оказалось то что нужно и невероятно просто. Я вот только не нашел где эта штука хранит данные на Android.

Во-вторых есть проблема. Есть MediaPlayer, который проигрывает музыку по ссылкам. С ним все хорошо до того момента, пока приложение (на Android) не в фоне. Как только я переключаю приложение в фон (например, в другом приложении нахожусь или просто на главном экране), то плеер не выдает сигнал MediaPlayer::EndOfMedia, если переключиться в приложение то сигнал сразу же прилетает.
Собственно вопрос: это баг плеера? Или это все из-за Android? Все пропало? Есть выход?
Записан
carrygun
Гость
« Ответ #16 : Январь 19, 2015, 06:46 »

Снова всем привет.

Добрался я таки на выходных до телефона и Qt.
В общем о предыдущей проблеме: это не баг - это фича. Все дело в самом Android: чтобы не кушать лишние ресурсы и батарейку, телефон любит спать при этом прибивая все лишнее. Причем все что живет в главном "гуевом" потоке умирает практически сразу когда ОС считает что оно не нужно, и это называется Activity. И тут либо делать сервис либо держать "WAKE_LOCK".

Почитал я побольше об этом деле и возникло два варианта.
Первый - набросать сервис с медиаплеером и броадкастрисивером, все это на яве и пробиваться пришлось бы туда через JNI. Не самый простой вариант, но реализуемый тем не менее.
Почитав еще побольше об особенностях ОС и ее возможностях решил начать со второго варианта - написать обертку плеера на C++, сунуть ее в тред, а треду уже сделать WAKE_LOCK.

Далее я набросал класс с QMediaPlayer и всякими вкусностями для его управления. После этого написал обертку с тредом и именно эту обертку прокинул в QML. Решил проверить без WAKE_LOCK, и о чудо, все сразу заработало как надо. Скорее всего медиаплеер в Qt собирается в правильный сервис или таки с WAKE_LOCK (у медиаплеера есть метод setWakeMode для таких вещей), так как позже я проверил просто тред с WAKE_LOCK и таймером, и он так же засыпал. В итоге получилось что плеер живет в отдельном треде ("незасыпаемом") и не зависит от жизни активити.

Ну и последний момент. Во-первых, пришлось в тред копировать список ссылок с музыкой, потому что активити умирает, а плееру нужно его где-то брать. Во-вторых, чтобы в "гуе" правильно отображать прогресс и время пришлось немного поменять схему. Если раньше мне сигналил плеер о прогрессе, то теперь я из активити опрашиваю плеер по таймеру. Сделано так потому что сигналы накопятся несмотря на мертвый активити, и при создании нового окна они все придут пачкой, а пачка перерисовок подтормаживает и выглядит некрасиво.

Вот такие дела.  Улыбающийся
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #17 : Январь 19, 2015, 11:20 »

Что-я не понял, т.е. достаточно в приложении сделать отдельный тред, всё приложение прибьется а тред останется? А как-же общая память? Или не тред а отдельный процесс.
Записан

Гугль в помощь
carrygun
Гость
« Ответ #18 : Январь 19, 2015, 11:35 »

Что-я не понял, т.е. достаточно в приложении сделать отдельный тред, всё приложение прибьется а тред останется? А как-же общая память? Или не тред а отдельный процесс.

Практика показала что просто тред уснет, как и завещает мануал андроида. Но тред с WAKE_LOCK по идее должен не давать заснуть, но я до этого не дошел, потому что тут либо Qt'шники в недрах JNI настроили плеер на лок, либо у него по умолчанию так стоит.
В любом случае обошлось без Java кода, это радует.
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #19 : Январь 19, 2015, 11:46 »

А ну так более менее понятно, уснуть может. А если процесс будет вытеснен, будет музыка играть (а он первый на вытеснение с учетом жирноты Qt)? Тут, кажется, без сервиса не обойтись.
Записан

Гугль в помощь
carrygun
Гость
« Ответ #20 : Январь 19, 2015, 11:58 »

Я так понимаю такой сценарий запускается когда кончается память и она нужна операционке? Да и там определенный порядок как ей поступать. Если мне не изменяет память, то сначала умирают активити, потом всякие ненужные треды, а потом сервисы по приоритетам. А все потому что нет свопа.  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #21 : Январь 19, 2015, 12:41 »

А все потому что нет свопа.  Улыбающийся
А у меня на samsung s5670 имеется такой.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #22 : Сентябрь 17, 2015, 13:11 »

Добрый день.
Вот вы пишите о проблеме:
Цитировать
Во-вторых есть проблема. Есть MediaPlayer, который проигрывает музыку по ссылкам. С ним все хорошо до того момента, пока приложение (на Android) не в фоне. Как только я переключаю приложение в фон (например, в другом приложении нахожусь или просто на главном экране), то плеер не выдает сигнал MediaPlayer::EndOfMedia, если переключиться в приложение то сигнал сразу же прилетает.
Я так понял Вам нужно было чтобы плеер работал когда приложение в фоне.
У меня другая проблема, после выхода (нажатии кн. Home на телефоне), приложение переключается в фоновый режим, а музыка приложения продолжает звучать. Как решить эту проблему? Подскажите.
Записан

Qt 5.11.0, Win, MinGW
alexorleon
Гость
« Ответ #23 : Апрель 14, 2016, 13:27 »

У меня просто класс, ничего заоблачного. Как правильно собирать под андроид? В доке есть примеры? Или ссылки какие?

Привет!
Столкнулся с такой же проблемой, не могу собрать либу под андроид. Не подскажешь как, может инструкция осталась?

Пример qmlextensionplugins из коробки.
TEMPLATE = lib
CONFIG += plugin

17:24:34: Не найден файл .pro приложения, APK не собирается.

при установке выдает:
Не удалось найти Json файл androiddeploy.
Ошибка при сборке/установке проекта qmlextensionplugins (комплект: Android для armeabi-v7a (GCC 4.9, Qt 5.6.0) )
Во время выполнения этапа «Установка на устройство Android»

Сейчас читаю http://doc.qt.io/qt-5/deployment-android.html#androiddeployqt но пока продвижений не наблюдается.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #24 : Май 24, 2016, 11:45 »

Всем привет!
Обновил версию Qt до 5.6.0 и начались проблемы. Все поставил по инструкции. Но тестовый вариант не собирается ни как.
Код:
makefile:475: recipe for target 'install_target' failed
process_begin: CreateProcess(NULL, cp -f libTestQML2.so D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build/libs/armeabi-v7a/libTestQML2.so, ...) failed.
make (e=2): Не удается найти указанный файл.

mingw32-make: [install_target] Error 2 (ignored)
Код:
Application binary is not in output directory: D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build//libs/armeabi-v7a/libTestQML2.so. Please run 'mingw32-make install INSTALL_ROOT=D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build/' first.
11:32:31: Процесс «C:\Qt\Qt5.6.0\5.6\android_armv7\bin\androiddeployqt.exe» завершился с кодом 7.
Записан

Qt 5.11.0, Win, MinGW
Vilgeforc
Гость
« Ответ #25 : Июнь 25, 2016, 14:27 »

Код:
mingw32-make: [install_target] Error 2 (ignored)


 в самом конце makefile есть строки
Код:
install_target: first FORCE
@test -d $(INSTALL_ROOT)/libs/armeabi-v7a/ || mkdir -p $(INSTALL_ROOT)/libs/armeabi-v7a/
-$(INSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/libs/armeabi-v7a/$(QMAKE_TARGET)
Если $(QMAKE_TARGET) взять в кавычки "$(QMAKE_TARGET)" то оно собирается без ошибок
Не понимаю почему(
Пока вручную правлю, хорошо бы понять, как сказать qmake  самому эти кавычки добавлять.
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #26 : Июнь 27, 2016, 13:48 »

Может папка пользователя с пробелами, или где там у вас что лежит?
Записан

Гугль в помощь
Vilgeforc
Гость
« Ответ #27 : Июнь 28, 2016, 00:21 »

папка пользователя с пробелами

Если бы, если бы. Это то и вызывает недоумение. Ни в пути проекта, ни в имени пользователя, ни в пути у ндк сдк и т.д., не то что пробелов и кирилицы нет, даже спец символы убраны.
По сути в мейкфайле у меня это меняет  libTheDemise.so на  "libTheDemise.so". Всё. При этом в первом случае ошибка, во втором успешная сборка. Я в недоумении.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 24.