AdMob, Qt 5.2 и Android или что бывает когда в интернете нет ответа

Здравствуйте, коллеги.

Qt 5 достаточно нов для того чтобы там не оказалось чего-то очень нужного. Вот так же выяснилось что там нет плагина для AdMob и других сервисов монетизации.
После того как вы разработали или портировали свое приложение на Qt под android, часто может встать вопрос монетизации. Кратко упомянуто о решении это проблемы в моем предыдущем посте. Здесь описано более подробно как встроить AdMob в Qt приложение под Android.

Поиск готового решения

V-play AdMob plugin

V-play платный фреймворк с плагином для встраивания разных сервисов в Qt приложения, в том числе и рекламные. Для кого-то это будет вполне приемлимое решение вопроса монетизации.

qadmob

Много ссылок в сети ведут именно на этот плагин, но он уже устарел.

Что помогло решить проблему

Помогли: документация для разработчика под Android, исходный код Qt и Necessities, а также немногочисленные стать, «отца» Qt под Android, Богдана Ватры.

Инструкция

Google Play Service

Вначале надо добавить Google Play Service (на данный момент именно там находится a AdMob java api) для совместной сборки с вашим проектом на Qt.

Шаг 1

Добавляем файл project.properties в папку где хранятся android файлы Qt проекта. В нем прописываем ссылку на библиотеку Google Play Service:
android.library.reference.1=./relative/path/to/google-play-services_lib
Важно указать именно относительный путь к директории библиотеки, с абсолютным путем будут ошибки при сборке. И естественно этот путь должен быть относительно build директори проекта, а не директории с исходным кодом.

Шаг 2

Это шаг может не понадобится, но если появляются ошибки при сборке попробуйте его.
В директории библиотеки ( /path_to_android_sdk/extras/google/google_play_services/libproject/google-play-services_lib/) нужно запустить следующие команды:

android update lib-project --path . ant clean ant release 
Шаг 3

Далее редактируем AndroidManifest.xml

добавляем права для загрузки рекламы:

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

добавляем версию Google Play Service в секцию application:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>   

добваляем activity в секцию application:

 <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:name="com.google.android.gms.ads.AdActivity"/>   
Добавлям AdMob баннер

После того как Google Play Service подключен к проекту, следует реализовать главное Activity, которое должно наследоваться от QtActivity, в нем уже надо добавить AdView. Вот как примерно это может выглядеть в коде:

Много кода

 package org.qtproject.example.admobqt;    import com.google.android.gms.ads.AdRequest;    import com.google.android.gms.ads.AdSize;    import com.google.android.gms.ads.AdView;    import com.google.android.gms.ads.AdListener;    import android.os.Bundle;    import android.view.View;    import android.view.ViewGroup;      public class AdMobQtActivity extends org.qtproject.qt5.android.bindings.QtActivity    {      private static ViewGroup viewGroup;      private AdView mAdView;      private boolean adAdded = false;      @Override      public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mAdView = new AdView(this);        mAdView.setAdUnitId("YOUR_ADMOB_ID_HERE");        mAdView.setAdSize(AdSize.BANNER);        View view = getWindow().getDecorView().getRootView();        if (view instanceof ViewGroup) {          viewGroup = (ViewGroup) view;          ViewGroup.LayoutParams ad_layout_params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 150);          mAdView.setLayoutParams(ad_layout_params);          mAdView.setAdListener( new AdListener() {            public void onAdLoaded(){              if( adAdded)                return;              adAdded = true;              viewGroup.addView( mAdView);            }          });          AdRequest adRequest = new AdRequest.Builder()            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)            .addTestDevice("INSERT_YOUR_HASHED_DEVICE_ID_HERE")            .build();          mAdView.loadAd( adRequest);        }      }      @Override      public void onPause() {        mAdView.pause();        super.onPause();      }      @Override      public void onResume() {        super.onResume();        mAdView.resume();      }      @Override      public void onDestroy() {        mAdView.destroy();        super.onDestroy();      }    }  

Здесь мы получаем корневое View из нашего Activity.

 View view = getWindow().getDecorView().getRootView();  

В Qt проекте это будет QtLayout, который наследуется от ViewGroup, что нам и позволяет включить в него AdView.
Далее надо добавить в ViewGroup AdView в тот момент когда реклама будет загружена. Если это сделать в функции onCreate то рекламный блог не отобразится пока не сменится ориентация экрана, либо пока приложение не будет свернуто и развернуто. Похоже это проблема в Qt java классах QtLayout.java и/или QtSurface.java.

       mAdView.setAdListener( new AdListener() {            public void onAdLoaded(){              if( adAdded)                return;              adAdded = true;              viewGroup.addView( mAdView);            }          });  

Вот что получилось в итоге:
github.com/AlexMarlo/AdMob-Qt5.2-Example

Полезные ссылки:
qt-project.org/doc/qt-5/qtandroidextras-notification-example.html
gitorious.org/qadmob
blog.qt.digia.com/blog/2013/12/12/implementing-in-app-purchase-on-android/
developer.android.com/tools/projects/index.html
developer.android.com/tools/projects/projects-cmdline.html

PS:
Следующим шагом должно быть создание полноценного кросплатформенного плагина для интеграции AdMob и других сервисов монетизации в Qt. Не уверен что смогу что-то такое сделать, но надеюсь что данная статья поможет кому-то справиться с этой задачей.

ссылка на оригинал статьи http://habrahabr.ru/post/220947/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *