Solved Troubles with QtAndroidTools
-
Hello everyone,
I want to implement the library QtAndroidTools of FalsinDoft because it has a lot of interesting features for Android.
I followed the instructions of the documentation but I received the errors like:
C:\Users\10alv\Documents\QtProgramas\PruebasAndroidTools\QtAndroidTools\QtAndroidTools.cpp:146: error: error: undefined reference to 'QAndroidAppPermissions::qmlInstance(QQmlEngine*, QJSEngine*)' C:\Qt\5.12.2\android_x86\include\QtQml\qqml.h:629: error: error: undefined reference to 'QAndroidGoogleAccount::staticMetaObject' C:\Qt\5.12.2\android_x86\include\QtCore\qmetatype.h:1476: error: error: undefined reference to 'QAndroidApkInfo::staticMetaObject' C:\Qt\5.12.2\android_x86\include\QtQml\qqmlprivate.h:103: error: error: undefined reference to 'QAndroidNotification::~QAndroidNotification()' C:\Qt\5.12.2\android_x86\include\QtCore\qmetatype.h:1832: error: error: undefined reference to 'QAndroidSharing::staticMetaObject'
For my first test, I tried to make an app that ask you for some permissions.
This is my .pro file:
QT += quick CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Refer to the documentation for the # deprecated API to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(QtAndroidTools/QtAndroidTools.pri) SOURCES += \ main.cpp RESOURCES += qml.qrc ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android DEFINES += \ QTAT_APP_PERMISSIONS \ QTAT_APK_EXPANSION_FILES \ QTAT_APK_INFO \ QTAT_SCREEN \ QTAT_SYSTEM \ QTAT_BATTERY_STATE \ QTAT_SIGNAL_STRENGTH \ QTAT_IMAGES \ QTAT_NOTIFICATION \ QTAT_ADMOB_BANNER \ QTAT_ADMOB_INTERSTITIAL \ QTAT_ADMOB_REWARDED_VIDEO \ QTAT_PLAY_STORE \ QTAT_GOOGLE_ACCOUNT \ QTAT_GOOGLE_DRIVE \ QTAT_SHARING # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
This my main():
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtAndroidTools.h> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QtAndroidTools::InitializeQmlTools(); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
And finally my main.qml:
import QtQuick 2.12 import QtQuick.Controls 2.5 import QtAndroidTools 1.0 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Hello World") color: "Red" readonly property var permissionsNameList: ["android.permission.WRITE_EXTERNAL_STORAGE","android.permission.READ_CALENDAR","android.permission.READ_PHONE_STATE","android.permission.READ_CONTACTS"] Button{ x: 100 y: 100 width: 100 height: 100 onClicked: { QtAndroidAppPermissions.requestPermissions(permissionsNameList) } } Connections { target: QtAndroidAppPermissions onRequestPermissionsResults: { for(var i = 0; i < results.length; i++) { if(results[i].granted === true) { setPermissionGranted(results[i].name, true); } else { if(QtAndroidAppPermissions.shouldShowRequestPermissionInfo(results[i].name) === true) { if(results[i].name === permissionsNameList[0]) requestPermissionWRITE_EXTERNAL_STORAGE.open(); else if(results[i].name === permissionsNameList[1]) requestPermissionREAD_CALENDAR.open(); else if(results[i].name === permissionsNameList[2]) requestPermissionREAD_PHONE_STATE.open(); else if(results[i].name === permissionsNameList[3]) requestPermissionREAD_CONTACTS.open(); } else { setPermissionGranted(results[i].name, false); } } } } } }
Does Anyones knows what I am doing wrong?
Thanks for your answers.
-
@Dooham said in Troubles with QtAndroidTools:
include(QtAndroidTools/QtAndroidTools.pri)
I think you have to move
include(QtAndroidTools/QtAndroidTools.pri)
after the defines! -
@KroMignon Ok that worked but now I get other errors:
symbol: variable INITIATION_STARTED location: class AndroidGoogleDrive.FileUploadProgressListener C:\Users\10alv\Documents\QtProgramas\build-PruebasAndroidTools-Android_for_x86_Clang_Qt_5_12_2_for_Android_x86-Release\android-build\src\com\falsinsoft\qtandroidtools\AndroidGoogleDrive.java:380: error: cannot find symbol case INITIATION_COMPLETE: ^ symbol: variable INITIATION_COMPLETE location: class AndroidGoogleDrive.FileUploadProgressListener C:\Users\10alv\Documents\QtProgramas\build-PruebasAndroidTools-Android_for_x86_Clang_Qt_5_12_2_for_Android_x86-Release\android-build\src\com\falsinsoft\qtandroidtools\AndroidGoogleDrive.java:383: error: cannot find symbol case MEDIA_IN_PROGRESS: Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. 85 errors :compileDebugJavaWithJavac FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 30s
-
@Dooham It look like there is an error in java class, the best is to contact the author. Maybe an Android API Level issue?
I don't know -
After doing some changes in the gradle file, I solved some errors but I get another one:
* What went wrong: Execution failed for task ':transformResourcesWithMergeJavaResForDebug'. > More than one file was found with OS independent path 'META-INF/DEPENDENCIES' * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 22s 27 actionable tasks: 1 executed, 26 up-to-date
Does anyones know the solution?
-
@Dooham Ok I found the trouble. You have to add the following lines to the build.graddle:
aaptOptions { noCompress 'rcc' } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/license.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/notice.txt' exclude 'META-INF/ASL2.0' }
Almost every trouble that I had was related with this file, I let you the final build.gradle that I use and it seems works:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0' } } repositories { google() jcenter() } apply plugin: 'com.android.application' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation 'com.android.support:support-v4:26.+' implementation 'com.google.android.gms:play-services-ads:16.+' implementation 'com.google.android.gms:play-services-auth:16.+' implementation 'com.google.http-client:google-http-client-gson:1.26.0' implementation('com.google.api-client:google-api-client-android:1.26.0') { exclude group: 'org.apache.httpcomponents' } implementation ('com.google.apis:google-api-services-drive:v3-rev173-1.25.0') { exclude group: 'org.apache.httpcomponents' } } android { /******************************************************* * The following variables: * - androidBuildToolsVersion, * - androidCompileSdkVersion * - qt5AndroidDir - holds the path to qt android files * needed to build any Qt application * on Android. * * are defined in gradle.properties file. This file is * updated by QtCreator and androiddeployqt tools. * Changing them manually might break the compilation! *******************************************************/ compileSdkVersion androidCompileSdkVersion.toInteger() buildToolsVersion androidBuildToolsVersion sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] res.srcDirs = [qt5AndroidDir + '/res', 'res'] resources.srcDirs = ['src'] renderscript.srcDirs = ['src'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] } } lintOptions { abortOnError false } aaptOptions { noCompress 'rcc' } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/license.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/notice.txt' exclude 'META-INF/ASL2.0' } }