...

среда, 30 апреля 2014 г.

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);
}
});


Вот что получилось в итоге:

http://ift.tt/1hw0Aeh


Полезные ссылки:

http://ift.tt/1hRYM3F

gitorious.org/qadmob

http://ift.tt/1hRYOsi

http://ift.tt/1exQsQF

http://ift.tt/OyTmyI


PS:

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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий