Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Jan. 25, 2019, 11:51 a.m.

Как добавить рекламу в приложения для Android

Android, Qt

Здравствуйте. Как добавить рекламу в приложения для Android?

23

Добрый день.

Вот этого лично я вам не подскажу. Можете поискать информацию на github, мне какие-то варианты попадались с реализацией для QML, также есть движок V-PLAY, которые базируется на Qt/QML, и в котором такая функция реализована из коробки. Если у них есть исходники в открытом доступе (по идее должны быть, поскольку Qt имеет базовую лицензицю LGPL), то можете покопаться в их исходниках.

0

Существует библиотека QtAdMob . Вот тут и тут описаны варианты ее использованияю Вот описан вариант на с++:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "QtAdMob/QtAdMobBanner.h"
#include "QtAdMob/QtAdMobInterstitial.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_Switch(false)
{
    ui->setupUi(this);

    m_Banner = CreateQtAdMobBanner();
    m_Banner->Initialize();
    m_Banner->SetUnitId("ca-app-pub-7485900711629006/8288667458");
    m_Banner->SetSize(IQtAdMobBanner::Banner);
    m_Banner->AddTestDevice("514ED2E95AD8EECE454CC5565326160A");
    m_Banner->Show();

    m_Interstitial = CreateQtAdMobInterstitial();
    m_Interstitial->LoadWithUnitId("ca-app-pub-7485900711629006/9462519453");
    m_Interstitial->AddTestDevice("514ED2E95AD8EECE454CC5565326160A");
    m_Interstitial->Show();

    connect(ui->okButton, SIGNAL(clicked()), this, SLOT(OnButtonOkClicked()));
}

MainWindow::~MainWindow()
{
    m_Banner->Shutdown();
    delete m_Banner;
    delete m_Interstitial;
    delete ui;
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    UNUSED(event);
    QPoint position((width() - m_Banner->GetSizeInPixels().width()) * 0.5f, 50.0f);
    m_Banner->SetPosition(position);
}

void MainWindow::OnButtonOkClicked()
{
    bool isShowed = m_Banner->IsShow();
    if (!isShowed)
    {
        m_Banner->Show();
        ui->okButton->setText("Hide Banner");
    }
    else
    {
        m_Banner->Hide();
        ui->okButton->setText("Show Banner");
    }
}

я подключил:

#include "QtAdMob/QtAdMobBanner.h"
#include "QtAdMob/QtAdMobInterstitial.h"

и пытаюсь создать банер

IQtAdMobBanner* banner = CreateQtAdMobBanner();

и уже тут появляются ошибки: ошибка: undefined reference to `QtAdMobBannerDummy::QtAdMobBannerDummy()' Хотя если делать так, то создается

IQtAdMobBanner* banner;

но CreateQtAdMobBanner() приминить не получается. Помогите пожалуйста разобраться.

0

IQtAdMobBanner* banner;

Эта штука просто говорит, что у вас есть указатель для объекта класса IQtAdMobBanner. Но это ничего не создаёт. Компилируется потом, что он скорее всего в подключённом заголовочнике есть.

Наверняка, вы не правильно библиотеку подключили. Там в репозитории есть пример подключения на виджетах. И вот там есть пример pro файла. Вы с ним сверялись?

#-------------------------------------------------
#
# Project created by QtCreator 2015-06-10T23:28:49
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QtAdMob
VERSION = 0.0.1
TEMPLATE = app

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/platform/android

SOURCES += \
    main.cpp \
    MainWindow.cpp \

HEADERS  += \
    MainWindow.h \

FORMS    += \
    MainWindow.ui

include(QtAdMob/QtAdMob.pri)

android:
{
    android:DISTFILES += \
            $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml \
            $$ANDROID_PACKAGE_SOURCE_DIR/build.gradle \
            $$ANDROID_PACKAGE_SOURCE_DIR/src/org/dreamdev/QtAdMob/QtAdMobActivity.java
}

ios:
{
    IOS_PACKAGE_SOURCE_DIR = $$PWD/platform/ios
    ios:QMAKE_INFO_PLIST = $$IOS_PACKAGE_SOURCE_DIR/Info.plist
    ios:QMAKE_IOS_DEPLOYMENT_TARGET = 7.0
}
1

Спасибо! Помогло.

0

Добавил в файле .срр в вункцию MainWindow::MainWindow(QWidget *parent) :

/QtAdMode
    myBanner = CreateQtAdMobBanner();
    myBanner->setUnitId("ca-app-pub-7485900711629006/8288667458");
    myBanner->setSize(IQtAdMobBanner::Banner);
    myBanner->addTestDevice("514ED2E95AD8EECE454CC5565326160A");
    myBanner->setVisible(true);
    //myBanner->Show();

    myInterstitial = CreateQtAdMobInterstitial();
    myInterstitial->addTestDevice("514ED2E95AD8EECE454CC5565326160A");

    myInterstitial->setVisible(true);
    myInterstitial->setUnitId("ca-app-pub-7485900711629006/9462519453");


    QPoint position((width() - myBanner->sizeInPixels().width()) * 0.5f, 0.0f);
    myBanner->setPosition(position);

все компилируется, но реклама не появляется. Также к банеру нельзя применить метод Show(). Пожалуйста, помогите разобраться с этой рекламой.

0

А вы откуда show взяли? я не нашёл намёка в актуальном репозитории.

Насчёт самой рекламы. Почитайте информацию в AdMob, возможно она просто сразу не показывается или не показывается по какой-то причине. Например, в Adsense до появления первой рекламы может полдня пройти.

0

Из этого примера:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "QtAdMob/QtAdMobBanner.h"
#include "QtAdMob/QtAdMobInterstitial.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_Switch(false)
{
    ui->setupUi(this);

    m_Banner = CreateQtAdMobBanner();
    m_Banner->Initialize();
    m_Banner->SetUnitId("ca-app-pub-7485900711629006/8288667458");
    m_Banner->SetSize(IQtAdMobBanner::Banner);
    m_Banner->AddTestDevice("514ED2E95AD8EECE454CC5565326160A");
    m_Banner->Show();

    m_Interstitial = CreateQtAdMobInterstitial();
    m_Interstitial->LoadWithUnitId("ca-app-pub-7485900711629006/9462519453");
    m_Interstitial->AddTestDevice("514ED2E95AD8EECE454CC5565326160A");
    m_Interstitial->Show();

    connect(ui->okButton, SIGNAL(clicked()), this, SLOT(OnButtonOkClicked()));
}

С документацией беда, там только 1 страничка текста: Изменил xml файл по образцу, после этого мое приложение перестало компилироваться компилятором android. Также этим компилятором изначально не компилировалось приложения из примера. Подскажите пожалуйста, в чем может быть беда? Мой xml файл выглядит так:

<?xml version="1.0"?>
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --" android:icon="@drawable/icon">

<!--This meta-data tag is required to use Google Play Services.-->
        <meta-data android:name="com.google.android.gms.version"
                   android:value="@integer/google_play_services_version"/>

<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
android:name="org.dreamdev.QtAdMob.QtAdMobActivity"
android:label="-- %%INSERT_APP_NAME%% --"
android:screenOrientation="unspecified"
android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <!-- Application arguments -->
            <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
            <!-- Application arguments -->

            <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
            <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
            <meta-data android:name="android.app.repository" android:value="default"/>
            <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
            <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
            <!-- Deploy Qt libs as part of package -->
            <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
            <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
            <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
            <!-- Run with local libs -->
            <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
            <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
            <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
            <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
            <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
            <!-- Used to specify custom system library path to run with local system libs -->
            <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
            <!--  Messages maps -->
            <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
            <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
            <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
            <!--  Messages maps -->

            <!-- Splash screen -->
            <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
            <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
            <!-- Splash screen -->

            <!-- Background running -->
            <!-- Warning: changing this value to true may cause unexpected crashes if the
                          application still try to draw after
                          "applicationStateChanged(Qt::ApplicationSuspended)"
                          signal is sent! -->
            <meta-data android:name="android.app.background_running" android:value="false"/>
            <!-- Background running -->

            <!-- auto screen scale factor -->
            <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
            <!-- auto screen scale factor -->

            <!-- extract android style -->
            <!-- available android:values :
                * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
                * full - useful QWidget & Quick Controls 1 apps
                * minimal - useful for Quick Controls 2 apps, it is much faster than "full"
                * none - useful for apps that don't use any of the above Qt modules
                -->
            <meta-data android:name="android.app.extract_android_style" android:value="default"/>
            <!-- extract android style -->
    </activity>

    <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->

    <!--Include the AdActivity configChanges and theme. -->
    <activity android:name="com.google.android.gms.ads.AdActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
    android:theme="@android:style/Theme.Translucent">
        <meta-data android:name="android.app.lib_name" android:value="QtAdMob"/>
    </activity>

    </application>

    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28"/>
    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>

    <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
         Remove the comment if you do not require these default permissions. -->
    <!-- %%INSERT_PERMISSIONS -->

    <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
         Remove the comment if you do not require these default features. -->
    <!-- %%INSERT_FEATURES -->

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

</manifest>

0

А ошибки какие выдаёт при компиляции?

0

Кпассны в консоли сборки написано: FAILURE: Build failed with an exception.

  • Where: Build file 'D:\QTProject\QtAdMobApp-master\build-QtAdMobApp-Android_armeabi_v7a_Clang_Qt_5_12_0_for_Android_ARMv7-Debug\android-build\build.gradle' line: 17

  • What went wrong: A problem occurred evaluating root project 'android-build'.

    Failed to apply plugin [id 'com.android.application'] Gradle version 2.2 is required. Current version is 4.6. If using the gradle wrapper, try editing the distributionUrl in D:\QTProject\QtAdMobApp-master\build-QtAdMobApp-Android_armeabi_v7a_Clang_Qt_5_12_0_for_Android_ARMv7-Debug\android-build\gradle\wrapper\gradle-wrapper.properties to gradle-2.2-all.zip

  • 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 -- Skipping D:/QT/5.12.0/android_armv7/plugins/iconengines/libqsvgicon.so. It has unmet dependencies: lib/libQt5Svg.so. -- Skipping D:/QT/5.12.0/android_armv7/plugins/imageformats/libqsvg.so. It has unmet dependencies: lib/libQt5Svg.so. Building the android package failed! -- For more information, run this command with --verbose. 14:50:11: Процесс «D:\QT\5.12.0\android_armv7\bin\androiddeployqt.exe» завершился с кодом 14. Ошибка при сборке/установке проекта QtAdMobApp (комплект: Android для armeabi-v7a (Clang Qt 5.12.0 for Android ARMv7)) Во время выполнения этапа «Сборка Android APK» 14:50:11: Прошло времени: 00:55.

0

Требует очень старую систему сборки gradle. (Сам по себе тот пример очень старый, вообще сдаётся мне что библиотека заброшена) Вы в своём проекте создавали свой Android Manifest, а потом исправляли, как там в примере было?

0

Да, и после этого тоже не компилировалось

0

Библиотека только первой версии с отсуствием последующих появившихся возможностей рекламы

0

не знаю тогда. Возможно имеет смысл форкнуть и переписать все нерабочие моменты, но это крупный объём работы. Пошагово придётся смотреть, что и где не работает и внедрять. В общем не самая радужная перспектива. Либо попробовать контактировать с автором библиотеки и уточнить, использует ли он её в реальных проектах сейчас или выбрал какую-то иную альтернативу.

0

Из альтернатив только V-Play. Но там похоже все на QML, а мое приложение все на с++. Скажите пожалуйста, QML это ведь альтеонатива дизайнеру и коду C++?

0

Нет, QML - это не альтернатива, а дополнение для замены фронтенда приложения. Критичные секции и бизнес-логику я всё равно писал на C++, также как и кастомные QML типы. Для меня это лишь удобная морда приложения.

Тоже самое касается и V-Play, ничто не мешает использовать его вместе со своими C++ классами. Я его пару лет назад пробовал, но не имел актуальных задач для внедрения V-Play в реальные проекты, поэтому особо не знаю, как там эта кухня варится на данный момент, но не думаю, что использование своего C++ бэкенда является такой проблемой там.

0

А есть ли удобный QML редактор, на подобие дизайнера c++? Или там каждую люнию вручную прописывать?

0

Создайте проект QML с ui формой и сами всё увидите. А так ещё в состоянии бета есть Qt Designer Studio, там даже какой-то функционал импорта из фотошоп вроде бы есть.

0

А как его создавать? Qt Quick - пустое?

0

Не нашел в моем Qt такой возможности:(

0

Создайте проект Qt Quick - Swipe. Там будет создан проект с файлами ui.qml

0

Спасибо, посмотрел. А можно ли код из .ui файла как то перенести в ui.qml?

0

Понятия не имею. Но также сомневаюсь, что кто-то делал подобные конверторы. Вручную переписывать придётся.

Наборы элементов очень сильно разнятся у классических виджетов и qml виджетов, тем более, что в QML присутствует то, чего нет в виджетах, например, Navigation Drawer и всё остальное, что относится к Material Design. По-хорошему, Вам следовало бы ознакомиться с текущим положением вещей, прежде чем писать под Андроид на виджетах.

0

спасибо

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

For registered users on the site there is a minimum amount of advertising