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/
Добавить комментарий