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. Не впевнений що зможу щось таке зробити, але сподіваюся що дана стаття допоможе комусь впоратися з цим завданням.
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.