Pull to refresh

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

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

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. Не уверен что смогу что-то такое сделать, но надеюсь что данная статья поможет кому-то справиться с этой задачей.
Tags:
Hubs:
+10
Comments5

Articles