Skocz do zawartości

Kurs Qt – #3 – pierwsza aplikacja mobilna na Androida


Komentator

Pomocna odpowiedź

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Testowałem tą część artykułu na Win10 i nie miałem problemów. Autor zwraca uwagę na tą odpowiednią wersję, ale tak to przeszło bez problemów. Nawet mogę powiedzieć, że zaskoczyło mnie, że jak zmienia się przy uruchamianiu Debug > Desktop QT na Android to zadziałało bez żadnych błędów.

  • Lubię! 1
Link do komentarza
Share on other sites

VICTORIA!!!

Udało sie skompilować i uruchomić aplikacje na Androida z Qt na Win10. Problemem okazała sie wersja android sdk

Ja miałem zainstalowana wersję 29. Musiałem ją wyinstalować i zainstalować wersję 28 (niższe też nie chciały działać). Wersję tę można też wybrać w opcjach projektu: trzeba wybrać Build Android APK. Wygląda jakby Qt Creator wybierał defaultowo najwyższą zainstalowana wersję.

Na trop naprowadziła mnie dyskusja: https://amin-ahmadi.com/2015/11/29/how-to-install-qt-for-android/

Qt dla Androida jest niestety bardzo czułe na wersje bibliotek. Podejrzewam, że nie jest to kwestia Windowsa czy Linuxa, na Linuxie miałem tylko wersje androida w wersji 28 od początku i stąd zapewne szybszy sukces.

W załącznikach screeny z moich ustawień i działający przykład na symulatorze (na tablecie też ruszyło).

PS. Czas na konkretną aplikację 🙂

BuildSettings.thumb.JPG.8f49b8ba66eb2bf3ac4535d3d0d0a2cf.JPGOptions.thumb.JPG.ed124310d6d83dbda1ca1defb230953a.JPGapp.thumb.JPG.96bc20adbb77c47e3b5097d72e5488d8.JPG

settingsAndroid.JPG

  • Lubię! 2
Link do komentarza
Share on other sites

Witam wszystkich. 

Ja również rozwiązałem problem w następujący sposób:

ustawiłem w gradle.properties:  (plik ten generuje się podczas budowy)

  •  androidBuildToolsVersion=28.0.3

Moje SDK to:

  • 26.1.1

Moje NDK to:

  • 20.0.5594570

W konfiguracji qmake.conf (ścieżka: C:\Qt\Qt5.13.0\5.13.0\android_x86\mkspecs\android-clang\qmake.conf) w wierszu 

  • QMAKE_LINK    = $$QMAKE_CXX $$QMAKE_CFLAGS -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a 

dopisałem

  • QMAKE_LINK    = $$QMAKE_CXX $$QMAKE_CFLAGS -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++

Następnie skorzystałem z porady:

Niestety to co chcę zrobić przy pomocy aplikacji wciąż jest problematyczne. A mianowicie skorzystać z klasy QNetworkManager i tu pojawia się problem bo Qt dla Androida potrzebuje osobne biblioteki do obsługi SSL.

Ponieważ nie mam problemu z Andorid Studio i Javą dałem sobie spokój.

Pozdrawiam

gradle.properties.PNG

Qt Android.png

@Matthew11 Gradle sam się generuje podczas budowania.

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć,

Mam podobne odczucia co do wykorzystania Qt dla Androida. Qt może byc fajnym rozwiazaniem jeżeli tworzymy wieloplatformowe aplikacje, jednakże jeżeli chcemy sie skupić na Androidzie, to Android Studio jest najlepszym rozwiązaniem.

Link do komentarza
Share on other sites

Witam,

Mam te same problemy co wyżej opisane (cannot find -lc++).

Android Studio działa poprawnie i aplikacja łączy się z telefonem w Win i Lin.

Qt 5.12 w Win działa poprawnie z mingw.

Zainstalowałem Ubuntu 18.04 od nowa i mam problem Qt nie widzi mkfile .

Dodałem gcc i g++ zamieniłem i to samo.

Może ktoś napisze jak instalować Qt na 18.04 co dodać itd.

To samo jak dodać poprawnie JDK .

Link do komentarza
Share on other sites

@akuch2  Moja konfiguracja na Ubuntu 18.04:

  • Narzędzia Qt:


910677388_Screenshotfrom2019-07-0716-27-37.thumb.png.edb7f2012a9933578eb69bd84f51ae17.png
 

  • openJDK:

Instalacja: https://openjdk.java.net/install/index.html

Standardowo ścieżka którą należy dodać w Qt powinna wygląda tak: /usr/lib/jvm/java-8-openjdk-amd64 możesz to też sprawdzić urchamiając w terminalu: "update-alternatives --list java". NDK i SDK tak samo jak na Windows u mnie konkretne wersje to SDK Version: 26.1.1, NDK Version: 19.2.5345600

1689661217_Screenshotfrom2019-07-0717-38-14.thumb.png.ca6d79256764c8f3043aeb5af1a3297d.png

  • Lubię! 1
Link do komentarza
Share on other sites

Witam ponownie,

Panowie wielkie dzięki za podpowiedzi.

Uruchomiłem zarówno na Win7 jak i wirtualce Ubuntu 18.04.

Na Win7 dodałem zmienne środowiskowe i poprawiłem plik qmqke.config i to załatwiło temat.

W ubuntu (po zainstalowaniu) dodałem:

  • sudo apt-get install openjdk-8-jdk - to poprawnie instaluje jave
  • sudo apt install build-essential - to kompilatory

Qt pobrałem z adresu   http://download.qt.io/official_releases/qt/5.12/ (na stronie Qt Download pomimo zaznaczenia opensource pobrałem triala). Pobrałem 5.12.3 i  Ndk 19c. Po zainstalowaniu i ustawieniu napis „Forbot” ukazał się na moim telefonie.

  • Lubię! 1
Link do komentarza
Share on other sites

Pierwsze podejście do Bluetooth w QT. Wcześniej pisałem "aplikacje" mobilne w Apache Cordova, w QT tylko na desktopy. Korzystałem m.in. z blogu

oraz repozytorium z przykładami z książki Qt-5-Projects.

ESP32Controller.thumb.png.271c9714e37dbd2bb44004976d1ca5d2.png
O dziwo 

QByteArray readingsLine = bt.socket->readLine();
receivedData = QString(readingsLine) + receivedData;

zniekształca otrzymywany tekst z mikrokontrolera (brakuje np pierwszej litery).

Swoją drogą jaki jest właściwy sposób przechowywania wskaźników

    QBluetoothDeviceDiscoveryAgent *agent = new QBluetoothDeviceDiscoveryAgent;
    QBluetoothSocket *socket;

tak by były dostępne z różnych klas (różnych okien aplikacji)? Static pointer w oddzielnej klasie?

Źródło mojej radosnej twórczości: ESP32Controller.zip

Link do komentarza
Share on other sites

Cześć @rziomber. Metoda, którą użyłeś readLine() według dokumentacji nie ma możliwości zwracania błędów więc nie dowiesz się czy dzieje się coś złego. Spróbuj printować wszystko co przychodzi w konsoli qDebug() << socket.readAll() - jak zobaczysz że nadal brakuje danych to problem leży raczej po stronie BT. Może zdarza się tak, że część danych (pierwsze znaki) "przychodzą" wraz z jednym sygnałem readyRead() a reszta z kolejnym. Zamiast czytania pojedynczych linii, spróbuj wykorzystać readAll() i gromdzić dane w jakimś buforze np. QByteArray jako member MainWindow i dopiero w tym buforze szukaj linii. Jeśli tracisz zawsze początek danych to strzelam, że wina leży w metodzie odczytu z socketu. 

Odnośnie wskaźników to nie sądze, żeby dobrym pomysłem było eksponowanie ich poza klasę. Raczej stworzyłbym kilka metod w tej klasie, w ktorej korzystam z socketu i agenta i tylko te udostępnił poza klasą i to za ich pomocą korzystał z QBluetoothDeviceDiscoveryAgent i QBluetoothSocket jeśli byłaby taka potrzeba. Więc przechowywałbym je jedynie w klasie, która obsługuje socket i agenta i z tej klasy korzystał. Przy okazji, podczas tworzenia nowych obiektów klas Qt -> new QBluetoothDeviceDiscoveryAgent używaj new QBluetoothDeviceDiscoveryAgent(this) albo sam zadbaj o zwolnienie pamięci po tych obiektach. Więcej info tutaj: https://doc.qt.io/qt-5/objecttrees.html#overview

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.