Всем привет! В этой статье хотел бы поделиться с Вами своей наработкой, а именно показать как работает процесс вручения пользователю игровой валюты (например, монет) при помощи AdMob Rewarded Video.

Около 3-х месяцев назад я начал разработку своего собственного проекта. Я планирую выпускать Android приложения на тему — викторины. Совсем недавно (около 2-х недель назад) я опубликовал в Google Play свое приложение-викторину с географическим уклоном. Да, я прекрасно понимаю, что таких викторин сотни, а то и тысячи и все они в большинстве своем повторяют функционал друг друга.
Многие такие проекты, если они от инди-разработчика (как мне показалось) имеют недостаточно правильно настроенные этапы монетизации. Будем откровенны, если ты инди, то главная твоя цель — это заработок на показах рекламы, продажи дополнительного контента и прочего. С правильным подходом к контенту и рекламе в большинстве случаев приложение найдет свою аудиторию. Можно сказать, монетизация — это залог успеха любого проекта/приложения.
Для себя я выделил несколько видов монетизации: рекламные объявления (банерная, межстраничная, видео) и sharing в социальных сетях (Facebook, Twitter, VK).
Я считаю, что за все эти пункты пользователь вашего приложения должен получать вознаграждение, чтобы чувствовать некую удовлетворенность.
Как подключить банерную или межстраничную рекламу большинство из Вас знают и читали различные туториалы, но скорей всего еще не сталкивались с подключением видео рекламы, да и информации в сети по этому вопросу не так много.
Это меня и сподвигло написать данный пост.
Итак, реализацию AdMob Rewarded Video Add я покажу на тестовом проекте. Из него будет полностью понятно как ее можно будет добавить в свой имеющийся проект или просто поработать с ней в дальнейшем. Также, косвенно затронем тему SharedPreferences для хранения монет.
Шаг 1:
Нам нужно сделать layout в котором у нас будет TextView (показываем кол-во монет), кнопка Video (нажатие на нее запускает просмотр рекламы) и кнопка Game (при клике будем добавлять по одной монете пользователю):

Шаг 2:
Приступим к имплементации.
В этом шаге нам нужно: добавить зависимости в gradle, инициализировать AdMob рекламу и создать несколько констант.
Добавляем зависимости:
Инициализируем Admob:
Cоздаем класс Constants.java:
В константе 'static final int REWARD_FOR_VIDEO' мы указываем какое кол-во монет даем пользователю за просмотр видео рекламы.
Шаг 3:
В этом шаге мы опишем действия, которые должны происходить, а именно: создадим нужные поля и дезактивируем кнопку 'Video' в методе onCreate(), запишем значения наших монет в SharedPreference, напишем метод loadRewardVideo(), которой будет загружать видео рекламу.
Шаг 4:
Создаем слушатель RewardedVideoAdListener. В методе onRewardedVideoAdLoaded() — мы активируем нашу кнопку, которую ранее выключили. Также, все основные свои действия проводим в методе onRewarded, в котором добавляем наши монеты за просмотр видео к имеющимся и по завершению рекламы показываем пользователю toast с текстом, что он получил награду в размере 20 монет.
В этом шаге мы проделали основные действия, которые добавляют логику по клику на кнопку, а также описали поведение видео-рекламы в слушателе RewardedVideoAdListener.
И последнее, добавим жизненные циклы к нашей видео рекламе:
И в целом это все. Результат можно посмотреть в этом видео:
P.S.: Еще раз напомню, что в этом примере я показал, как это сделать в тестовом проекте. В своем приложении это реализовано более ярко и красочно с использованием кастомных кнопок. Ссылку на свое приложение оставлю в комментарии к посту, чтобы не быть заблокированным за рекламу.
P.P.S.: Также, мне кажется, что в инди-разработке Android приложений в области викторин нужно иметь представление о работе с кастомными кнопками.
Правильная система монетизации и умение создать кнопку любой формы и вида — наше все. Свою следующую статью я бы хотел посветить именно этой теме и показать, как правильно работать с кнопками на девайсах с pre lollipop и выше.
              
            
Предисловие
Около 3-х месяцев назад я начал разработку своего собственного проекта. Я планирую выпускать Android приложения на тему — викторины. Совсем недавно (около 2-х недель назад) я опубликовал в Google Play свое приложение-викторину с географическим уклоном. Да, я прекрасно понимаю, что таких викторин сотни, а то и тысячи и все они в большинстве своем повторяют функционал друг друга.
Многие такие проекты, если они от инди-разработчика (как мне показалось) имеют недостаточно правильно настроенные этапы монетизации. Будем откровенны, если ты инди, то главная твоя цель — это заработок на показах рекламы, продажи дополнительного контента и прочего. С правильным подходом к контенту и рекламе в большинстве случаев приложение найдет свою аудиторию. Можно сказать, монетизация — это залог успеха любого проекта/приложения.
Для себя я выделил несколько видов монетизации: рекламные объявления (банерная, межстраничная, видео) и sharing в социальных сетях (Facebook, Twitter, VK).
Я считаю, что за все эти пункты пользователь вашего приложения должен получать вознаграждение, чтобы чувствовать некую удовлетворенность.
Как подключить банерную или межстраничную рекламу большинство из Вас знают и читали различные туториалы, но скорей всего еще не сталкивались с подключением видео рекламы, да и информации в сети по этому вопросу не так много.
Это меня и сподвигло написать данный пост.
Начало работы
Итак, реализацию AdMob Rewarded Video Add я покажу на тестовом проекте. Из него будет полностью понятно как ее можно будет добавить в свой имеющийся проект или просто поработать с ней в дальнейшем. Также, косвенно затронем тему SharedPreferences для хранения монет.
Шаг 1:
Нам нужно сделать layout в котором у нас будет TextView (показываем кол-во монет), кнопка Video (нажатие на нее запускает просмотр рекламы) и кнопка Game (при клике будем добавлять по одной монете пользователю):

Шаг 2:
Приступим к имплементации.
В этом шаге нам нужно: добавить зависимости в gradle, инициализировать AdMob рекламу и создать несколько констант.
Добавляем зависимости:
compile 'com.google.firebase:firebase-core:10.2.0'
compile 'com.google.firebase:firebase-ads:10.2.0'
Инициализируем Admob:
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MobileAds.initialize(this, Constants.ADMOB_ID);
    }
}
Cоздаем класс Constants.java:
class Constants {
    private Constants() {
        throw new AssertionError();
    }
    static final String PREF_COINS = "pref_coins";
    static final String ADMOB_ID = "YOUR_ADMOB_ACCOUNT_ID_HERE";
    static final String AD_MOB_REWARDED_VIDEO_ID = "YOUR_ADMOB_ADD_ID";
    
    static final int REWARD_FOR_VIDEO = 20;
}
В константе 'static final int REWARD_FOR_VIDEO' мы указываем какое кол-во монет даем пользователю за просмотр видео рекламы.
Шаг 3:
В этом шаге мы опишем действия, которые должны происходить, а именно: создадим нужные поля и дезактивируем кнопку 'Video' в методе onCreate(), запишем значения наших монет в SharedPreference, напишем метод loadRewardVideo(), которой будет загружать видео рекламу.
public class MainActivity extends AppCompatActivity {
    private AdRequest mAdRequest;
    private RewardedVideoAd mRewardedVideoAd;
    private SharedPreferences mSharedPreferences;
    private TextView mTextCoins;
    private Button mButtonVideo;
    private int coins;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        coins = mSharedPreferences.getInt(PREF_COINS, 0);
        setContentView(R.layout.activity_main);
        mButtonVideo = (Button) findViewById(R.id.btn_video);
        mButtonVideo.setOnClickListener(clickListener);
        mButtonVideo.setEnabled(false);
        findViewById(R.id.btn_game).setOnClickListener(clickListener);
        mTextCoins = (TextView) findViewById(R.id.tv_coins);
        mTextCoins.setText(getResources().getQuantityString(R.plurals.coins, coins, coins));
        //AdMob Rewarded Video
        mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
        mRewardedVideoAd.setRewardedVideoAdListener(rewardedVideoAdListener);
        mAdRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .build();
        loadRewardVideo();
    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_video:
                    if (mRewardedVideoAd.isLoaded()) {
                        mRewardedVideoAd.show();
                    }
                    break;
                case R.id.btn_game:
                    coins++;
                    mTextCoins.setText(getResources().getQuantityString(R.plurals.coins,
                    coins, coins));
                    break;
            }
        }
    };
    private void loadRewardVideo() {
        mRewardedVideoAd.loadAd(AD_MOB_REWARDED_VIDEO_ID, mAdRequest);
    }
}
 Шаг 4:
Создаем слушатель RewardedVideoAdListener. В методе onRewardedVideoAdLoaded() — мы активируем нашу кнопку, которую ранее выключили. Также, все основные свои действия проводим в методе onRewarded, в котором добавляем наши монеты за просмотр видео к имеющимся и по завершению рекламы показываем пользователю toast с текстом, что он получил награду в размере 20 монет.
 private RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        @Override
        public void onRewardedVideoAdLoaded() {
            mButtonVideo.setEnabled(true);
        }
        @Override
        public void onRewardedVideoAdOpened() {
        }
        @Override
        public void onRewardedVideoStarted() {
        }
        @Override
        public void onRewardedVideoAdClosed() {
            mButtonVideo.setEnabled(false);
            loadRewardVideo();
        }
        @Override
        public void onRewarded(RewardItem rewardItem) {
            coins += REWARD_FOR_VIDEO;
            mTextCoins.setText(getResources().getQuantityString(R.plurals.coins, coins, coins));
            String msg = getResources().getQuantityString(R.plurals.congrats, REWARD_FOR_VIDEO,
                    REWARD_FOR_VIDEO);
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            mSharedPreferences.edit().putInt(PREF_COINS, coins).apply();
        }
        @Override
        public void onRewardedVideoAdLeftApplication() {
        }
        @Override
        public void onRewardedVideoAdFailedToLoad(int i) {
        }
};
В этом шаге мы проделали основные действия, которые добавляют логику по клику на кнопку, а также описали поведение видео-рекламы в слушателе RewardedVideoAdListener.
И последнее, добавим жизненные циклы к нашей видео рекламе:
@Override
    protected void onPause() {
        super.onPause();
        mSharedPreferences.edit().putInt(PREF_COINS, coins).apply();
        if (mRewardedVideoAd != null) {
            mRewardedVideoAd.pause(this);
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (mRewardedVideoAd !=null) {
            mRewardedVideoAd.resume(this);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mRewardedVideoAd != null) {
            mRewardedVideoAd.destroy(this);
        }
    }
 И в целом это все. Результат можно посмотреть в этом видео:
P.S.: Еще раз напомню, что в этом примере я показал, как это сделать в тестовом проекте. В своем приложении это реализовано более ярко и красочно с использованием кастомных кнопок. Ссылку на свое приложение оставлю в комментарии к посту, чтобы не быть заблокированным за рекламу.
P.P.S.: Также, мне кажется, что в инди-разработке Android приложений в области викторин нужно иметь представление о работе с кастомными кнопками.
Правильная система монетизации и умение создать кнопку любой формы и вида — наше все. Свою следующую статью я бы хотел посветить именно этой теме и показать, как правильно работать с кнопками на девайсах с pre lollipop и выше.
Комментарии (9)

mokhin-denis
07.08.2017 10:10А если у меня Unity?

StanZakharov Автор
07.08.2017 15:58Не знаю как с юнитит. Я пишу на нативном Андроиде, поэтому и опубликовал в хабе Разработка под Андроид.

TymofiiK
12.08.2017 11:46Ни о чем, просто передран туториал.
Я за то, чтобы на хабре решались сложные технические вопросы, а инди-разработчики пиарили свои игры в другом месте.
          
 
StanZakharov Автор
Ссылка на приложение, где можно посмотреть, как работает AdMob Rewarded Video:
https://play.google.com/store/apps/details?id=com.mobilesoftproduction.guesscountry
petrovichtim
Ради этого статья и писалась?
StanZakharov Автор
Ну вот если бы ради этого, как считаешь, заморачивался бы я с новым проектом, чтоб показать как это реализовать? Без проблем могу убрать ссылку.
petrovichtim
Пример слишком простой, это всё есть в доке, чего-нибудь посложнее бы.
StanZakharov Автор
Я в данной статье описал конкретный кейс, как давать монеты за просмотр видео, отключать и включать кнопку, когда видео подгружено или нет. Думаю, это 90% случаев когда Video Ad применима.