Страницы

Поиск по вопросам

Показаны сообщения с ярлыком admob. Показать все сообщения
Показаны сообщения с ярлыком admob. Показать все сообщения

пятница, 24 января 2020 г.

После вызова onAdClosed activity переходит по циклу своему в onDestroy

#android #android_fragment #activity #admob


Реализовал в приложении загрузку и отображение рекламы AdMob типа Interstitial /
Межстраничный. 

Переходы: Запуск -> ActivitySplash -> Activity2 -> ActivityMain

Пользователь запускает приложение, смотрит на ActivitySplash, в onCreate() которого
присутствует код


AdMobInterstitialLoader adMobInterstitialLoader = new AdMobInterstitialLoader(this);
adMobInterstitialLoader.createAd();


Класс AdMobInterstitialLoader


public class AdMobInterstitialLoader {

    private static boolean isInterAdsShowed = false;
    private Activity mActivity;

    // static fields are shared between all instances
    private static InterstitialAd mInterstitialAd;

    public AdMobInterstitialLoader(Activity activity) {
        this.mActivity = activity;
        createAd();
    }

    public void createAd() {
        // create an Ad
        mInterstitialAd = new InterstitialAd(mActivity);
        mInterstitialAd.setAdUnitId(mActivity.getString(R.string.interstitial_ad_unit_id));

        AdRequest adRequest;
        // DEBUG or RELEASE
        if (BuildConfig.DEBUG) {
                adRequest = new AdRequest.Builder()
                        .addTestDevice(DeviceHash.getMyDeviceHash())
                        .build();
        } else {
            adRequest = new AdRequest.Builder()
                    .build();
        }

        // load the interstitial ad
        mInterstitialAd.loadAd(adRequest);

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                if (mInterstitialAd.isLoaded()) {
                    mInterstitialAd.show();
                }
            }
        });
    }

    public static InterstitialAd getInterstitialAd() {
        if (mInterstitialAd != null
                && mInterstitialAd.isLoaded()
                && !isInterAdsShowed) {
            isInterAdsShowed = true;
            return mInterstitialAd;
        } else {
            return null;
        }
    }

}



После отображения ActivitySplash его я принудительно уничтожаю, чтобы юзер в будущем
не смог аппаратной кнопкой Назад вернуть. Применяю finish(). Грубовато, но ничего другого
не придумал пока.

Activity2 доступно пользователю ТОЛЬКО, если это первый запуск приложения. Поэтому
в последующих запусках мы просто его не вызываем, а сразу на ActivityMain. Оно загружается,
и, когда приложение загрузило полностью Interstitial баннер, оно его сразу же отображает
(это прописано в методе обратного вызова класса AdMobInterstitialLoader.

В ActivityMain чередуются Fragment'ы.

Сама проблема.

Запускаю приложение, прохожу по Activity, загружается полностью ActivityMain, отображается
нужный Fragment, поверх экрана появляется Interstitial баннер, я его закрываю крестиком
вверху или аппаратной кнопкой Назад. Вместе с баннером закрывается приложение.

По логам видно, что Activity и Fragment уверенно прошлись по своим жизненным  циклам
до onDestroy(). Я в замешательстве. Что это может быть ? 
    


Ответы

Ответ 1



Нашел я причину возникновения этого явления. Суть была в методе startNextActivity(), реализация которого - примитив. И, естественно, я его свернул, т.к. нечего в нем дорабатывать или улучшать. Но, когда появляется нездоровое поведение приложения, начинаешь заглядывать во все углы кода. Моя проблема была заключена в флаге Intent.FLAG_ACTIVITY_NO_HISTORY, который я когда-то поставил для некоторых нужд. И ЗАБЫЛ // [ START startNextActivity() ] private void startNextActivity(Class nextActivityClass) { Intent intent = new Intent(this, nextActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } // [ END startNextActivity() ] Этот флаг нужно удалить Материал по Intent и флагам: ENG - Intent @ developer.android.com RU - Урок 116. Поведение Activity в Task. Intent-флаги, launchMode, affinity @ http://startandroid.ru И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)

Хороший аналог Admob в России

#java #android #admob #встроенная_реклама


Работал с Admob, все было хорошо, но ограничили показ т.к. контент приложения связан
с азартными играми(хоть и косвенно).

Можете предложить замену Admob с которым вы работали и в котором нормальные условия? 

Или может посоветуете медиатор с которым работаете?..
    


Ответы

Ответ 1



Посмотрите в сторону Smaato - работал с ним в эпоху, когда Play Market не позволял выставлять платные приложения, а AdMob'а еще и не было в помине. Тогда позволял выводить денежки только на PayPal, сейчас не знаю.

пятница, 10 января 2020 г.

Не работает текстовая/видео реклама admob

#android #admob


Обычный баннер работает, а контекстовая реклама и видео не работает(межстраничное
объявление). Вообще пустое место ничего вообще не показывает.

main_activity

AdView mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);


main.xml

                 // мой код 
                    

    


Ответы

Ответ 1



Видео и межстраничная реклама могут работать только в больших View. У вас же баннер маленький (ads:adSize="BANNER") и они там не поместятся. Засим вам надо или как тут создать отдельную AdView для этих типов реклам или вообще не создавать для них отдельного View, а доверить их создание самому adMob-у, как показано в официальной документации по Interstitial Ads Также проверьте, что эти типы рекламм включены в вашем аккаунте как показано тут

воскресенье, 22 декабря 2019 г.

Как запустить рекламу адмоба(видео) при старте приложения?

#java #android #admob #activity_life_cycle


Ссылка на офф. документацию : https://developers.google.com/admob/android/interstitial

Сделал как там все описано - работает, но только при нажатии кнопки. А как сделать,
что бы при каждом запуске приложения отображалась реклама 1 раз? 
    


Ответы

Ответ 1



Надо отследить что пользователь открыл приложение, а не (например) повернул. Это можно сделать проверив if(savedInstanceState==null) это аргумент в onCreate методе активити. После её поворота (пересоздания) этот аргумент уже не null и условие выполнено не будет. В этом условии сформировать запрос к AdMob Запустить его и ждать пока реклама не отобразится. public class MainActivity extends ActionBarActivity { boolean adsAlredyShown = false; InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { Log.i("LOG", "onCreate"); super.onCreate(savedInstanceState); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); //идентификатор из доков надо заменить на свой mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { Log.i("LOG", "onAdClosed"); } public void onAdLeftApplication() { Log.i("LOG", "onAdLeftApplication"); } @Override public void onAdLoaded() { Log.i("LOG", "onAdLoaded"); mInterstitialAd.show(); } public void onAdFailedToLoad(int errorCode) { Log.e("LOG", "onAdFailedToLoad with errorCode " + errorCode); } @Override public void onAdOpened() { Log.i("LOG", "onAdOpened"); //вызывается в момент отображения рекламы. //и раз она отобразилась ставим флаг в true //чтобы больше её не показывать adsAlredyShown = true; } }); if(savedInstanceState==null) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } else { adsAlreadyShown = savedInstanceState.getBoolean("AdsAlreadyShown", false); //реклама ещё не показывалась if(!adsAlreadyShown) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } } } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("AdsAlreadyShown", adsAlreadyShown); } } Также, в тот же savedInstanceState можно поместить флаг после показа рекламы и не показывать её пока он true. Этот флаг исчезнет только если активити будет убита системой или вручную методом finish()

Ответ 2



Дык, по правилам Гугла, рекламу Запрещено отображать при старте приложения ? Недопустимые способы размещения межстраничных объявлений

понедельник, 16 декабря 2019 г.

Реклама съедает память устройства

#java #android #admob


Решил я попробовать добавить в одно своё Activity рекламу. Выбор упал на знаменитый
AdMob. Всё сделал, реклама работает. 

Прошло время, заметил, что приложение стало потреблять больше памяти. Методом поэтапного
удаления выяснил, что источник проблем заключается как раз в рекламе, а точнее в нескольких
строчках установки рекламы. Вот они сами:

AdView MyBanner = (AdView) findViewById(R.id.MyBanner_id);

MobileAds.initialize(getApplicationContext(), "ca-app-pub-XXX~YYY");

AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice("ZZZ")
                .build();
MyBanner.loadAd(adRequest);


Profiler говорит, что без этих строк MEMORY 35mb , со строками 80mb

Вопрос: как иметь рекламу и не тратить так много памяти?
    


Ответы

Ответ 1



AdMob использует WebView для загрузки объявлений. Это довольно ресурсоёмкий объект, который использует собственные библиотеки и подвержен сбоям. У вас нет никакого контроля над тем, как работает Admob SDK. Кроме того, использование памяти, вероятно, будет варьироваться в зависимости от типа объявления: тексты HTML и баннеры с изображениями и т.д. Так же не стоит забывать про то, что нужно управлять жизненным циклом объявлений @Override protected void onPostResume() { super.onPostResume(); mAdView.resume(); } @Override protected void onPause() { super.onPause(); mAdView.pause(); } @Override protected void onDestroy() { super.onDestroy(); mAdView.destroy(); } Это должно помочь избежать утечек памяти. С объёмом используемой памяти остаётся только смириться. Можете почитать про AdMob подробнее перейдя по ссылке.

вторник, 10 декабря 2019 г.

Google Play, регистрация в Google Merchant, покупки внутри приложения, легальная сторона вопроса

#android #google_play #admob #in_app_purchases


Закончил работу над своим первым приложеним с рекламой и возможностью покупки полной
версии без рекламы и с дополнительными функциями, зарегистрировался в google play developer
console, все оплатил. 

Насколько я понял, что для того чтобы реализовать покупки внутри приложения нужен
Google Merchant аккаунт. 
У меня есть несколько, возможно, глупых вопросов по этому поводу:


У меня пока нет ни вебсайта ни доменного имени и нет пока возможности зарегистрировать
(Могу ли я там использовать свою
github.io страницу ?)
Не совсем понимаю как нужно заполнять всю информацию для регистрации в Google Merchant,
у меня нет ни ИП, ни компании. Можно ли обойтись без оформления оных ? Совсем не факт,
что с приложения будут приходить значительные деньги, так что не знаю стоит ли все
это лишних телодвижений прямо сейчас.
Возможно ли сначала выложить работающее приложение, чтобы продажи шли, но не перечислялись
на мой банковский счет, а потом уже при достаточной накопленной сумме зарегистрировать
ИП, перевести средства на свой счет, заплатить налоги и т.д. ?
Если я решу оставить лишь рекламу в приложении без покупки полной версии, нужен ли
будет Google Merchant ? И как будет с выводом денег в этом случае ? Насколько я понимаю,
деньги могут накапливаться на счете admob и их потом можно когда угодно вывести ?
P.S. Нахожусь в России

    


Ответы

Ответ 1



Сайт и домен не нужны - можете или не заполнять или да - гитХаб указать. Ни ИП, ни компания не являются обязательным условием. Думаю, если вы ИП укажете, то не ошибётесь. Да, вы можете копить сколь угодно деньги на гугловом счёту и лишь потом озаботиться созданием счёта своего для вывода. Деньги никуда не денутся. Google Merchant нужен только для получения прибули из самого маркета. Рекламые доходу идут на другие счета и никак с самим маркетом не связаны. Вот тут есть ещё полезной инфы о выводе денег с AdMob и Google Merchant: Вывод денег из аккаунтов Google Play и AdMob Регистрация аккаунта разработчика Google Play и вывод денег в России

воскресенье, 24 ноября 2019 г.

Регистрация аккаунта разработчика Google Play и вывод денег в России


Мне нужно создать аккаунт разработчика в Google Play для того, чтобы выкладыват
свои приложения и получать денежные средства с рекламы в этих приложениях. Какой банковски
счёт для этого нужен? Где нужно регистрироваться? Какие есть нюансы при выводе денег в России? Я хотел бы поподробнее узнать про регистрацию аккаунта разработчика в Google Play, про то, какая кредитная карта для этого нужна, и где её получить, и про вывод денег в России.
    


Ответы

Ответ 1



Нужна карта с возможностью платить в Интернете для первоначального взноса в 25 долларо в Google Play (заплатить надо всего один раз, в отличие от яблочного акка разработчика где платить надо раз в год). Лично я пользовался виртуальной QIWI-картой. Для её получения нужна SIM-карта (для регистрации аккаунта в QIWI). Далее, на сайте или в приложении создаёте карту с любыми данными о владельце и платите. Нужен долларовый счёт с возможностью получать доллары из-за границы. Мне помог этом Сбербанк (счёт открывают за $5, которые оказываются неснимаемой суммой на счету Счёт называется "Универсальный"). Дали бумажную книжку по паспорту, реквизиты. Ввё это в аккаунте - деньги пришли. Далее, если хочется удобств - можно оформить сбербанковскую же карту (за 780 рублей в виде страховки единовременной. Далее можно и не платить её. Нужен паспорт). С ней можно в онлайн-банке доллары в рубли перевести на карту и с карты уже в банкомате наличные снять. Либо по старинке отстоять очередь в отделении и снять наличные по паспорту и книжке. Для рекламы нужен отдельный аккаунт. В моём случае - AdMob. Там всё так же, за исключение первоначального взноса. Но есть один нюанс: после достижения некой пороговой суммы доходо за рекламу будет плашка в аккаунте повешена с предложением вбить адрес для высылки бумажного (sic!) письма с пин-кодом, который должен (после его получения и вбития в аккаунте) убедить AdMob в том, что вы реальный человек. Идёт оно из Калифорнии, готовьтесь к его длительному ожиданию. Сама регистрация не сложная. Просто вбиваем запрашиваемые данные. Итог: Нужны SIM-карта, банковская карта, паспорт РФ, 30 долларов и чуть-чуть прямых рук. P.S. Вот тут ещё чуть-чуть информации: Вывод денег из аккаунтов Google Play и AdMob.

Ответ 2



Добавлю ещё три вещи: долларовый счёт не обязателен. Деньги автоматически конвертнутся в валюту счёта приходят они очень быстро, через 2-3 дня Гугл плей требует так называемый BIK банка. Обычно его при международных платежа никто не спрашивает. Короче, это внутрероссийский БИК. На листочке с реквизитами банки обычно его не указывают, но его легко нагуглить в инете

пятница, 12 июля 2019 г.

После вызова onAdClosed activity переходит по циклу своему в onDestroy

Реализовал в приложении загрузку и отображение рекламы AdMob типа Interstitial / Межстраничный.
Переходы: Запуск -> ActivitySplash -> Activity2 -> ActivityMain
Пользователь запускает приложение, смотрит на ActivitySplash, в onCreate() которого присутствует код
AdMobInterstitialLoader adMobInterstitialLoader = new AdMobInterstitialLoader(this); adMobInterstitialLoader.createAd();
Класс AdMobInterstitialLoader
public class AdMobInterstitialLoader {
private static boolean isInterAdsShowed = false; private Activity mActivity;
// static fields are shared between all instances private static InterstitialAd mInterstitialAd;
public AdMobInterstitialLoader(Activity activity) { this.mActivity = activity; createAd(); }
public void createAd() { // create an Ad mInterstitialAd = new InterstitialAd(mActivity); mInterstitialAd.setAdUnitId(mActivity.getString(R.string.interstitial_ad_unit_id));
AdRequest adRequest; // DEBUG or RELEASE if (BuildConfig.DEBUG) { adRequest = new AdRequest.Builder() .addTestDevice(DeviceHash.getMyDeviceHash()) .build(); } else { adRequest = new AdRequest.Builder() .build(); }
// load the interstitial ad mInterstitialAd.loadAd(adRequest);
mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { if (mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } } }); }
public static InterstitialAd getInterstitialAd() { if (mInterstitialAd != null && mInterstitialAd.isLoaded() && !isInterAdsShowed) { isInterAdsShowed = true; return mInterstitialAd; } else { return null; } }
}

После отображения ActivitySplash его я принудительно уничтожаю, чтобы юзер в будущем не смог аппаратной кнопкой Назад вернуть. Применяю finish(). Грубовато, но ничего другого не придумал пока.
Activity2 доступно пользователю ТОЛЬКО, если это первый запуск приложения. Поэтому в последующих запусках мы просто его не вызываем, а сразу на ActivityMain. Оно загружается, и, когда приложение загрузило полностью Interstitial баннер, оно его сразу же отображает (это прописано в методе обратного вызова класса AdMobInterstitialLoader.
В ActivityMain чередуются Fragment'ы
Сама проблема.
Запускаю приложение, прохожу по Activity, загружается полностью ActivityMain, отображается нужный Fragment, поверх экрана появляется Interstitial баннер, я его закрываю крестиком вверху или аппаратной кнопкой Назад. Вместе с баннером закрывается приложение.
По логам видно, что Activity и Fragment уверенно прошлись по своим жизненным циклам до onDestroy(). Я в замешательстве. Что это может быть ?


Ответ

Нашел я причину возникновения этого явления.
Суть была в методе startNextActivity(), реализация которого - примитив. И, естественно, я его свернул, т.к. нечего в нем дорабатывать или улучшать. Но, когда появляется нездоровое поведение приложения, начинаешь заглядывать во все углы кода. Моя проблема была заключена в флаге Intent.FLAG_ACTIVITY_NO_HISTORY, который я когда-то поставил для некоторых нужд. И ЗАБЫЛ
// [ START startNextActivity() ] private void startNextActivity(Class nextActivityClass) { Intent intent = new Intent(this, nextActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } // [ END startNextActivity() ]
Этот флаг нужно удалить
Материал по Intent и флагам:
ENG - Intent @ developer.android.com RU - Урок 116. Поведение Activity в Task. Intent-флаги, launchMode, affinity @ http://startandroid.ru
И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)

четверг, 11 июля 2019 г.

Не показывается реклама admob

Добрый день!
Пытаюсь добавить рекламу в свое приложение, все по инструкции https://developers.google.com/mobile-ads-sdk/docs/admob/android/quick-start
Сначала добавил строчку в build.gradle (module: app)
compile 'com.google.android.gms:play-services:7.0.0'
Изменил манифест

+

+

Добавил
ca-app-pub-3940256099942544/6300978111
Изменил .xml файл
xmlns:ads="http://schemas.android.com/apk/res-auto"
+

Добавил в код активити:
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView;
+
AdView mAdView = (AdView) findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest);
При рендеринге в android studio видно место под баннер, но при запуске приложения баннера нет
05-05 15:14:49.746 1386-1386/su.worldbest.bbdd W/GooglePlayServicesUtil﹕ Google Play services is missing. 05-05 15:14:49.770 1386-1386/su.worldbest.bbdd W/GooglePlayServicesUtil﹕ Google Play services is missing. 05-05 15:14:49.790 1386-1389/su.worldbest.bbdd D/dalvikvm﹕ GC_CONCURRENT freed 208K, 3% free 8742K/8976K, paused 4ms+2ms, total 14ms 05-05 15:14:49.802 1386-1386/su.worldbest.bbdd I/Ads﹕ CsiReporterFactory: CSI is not enabled. No CSI reporter created. 05-05 15:14:49.814 1386-1386/su.worldbest.bbdd I/Ads﹕ Starting ad request. 05-05 15:14:49.818 1386-1386/su.worldbest.bbdd I/Ads﹕ Use AdRequest.Builder.addTestDevice("D5C4A6CB58FB68100CD3CBDF39CB8F22") to get test ads on this device. 05-05 15:14:49.870 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DexOpt: --- BEGIN 'ads-1062427778.jar' (bootstrap=0) --- 05-05 15:14:49.894 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DexOpt: --- END 'ads-1062427778.jar' (success) --- 05-05 15:14:49.894 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DEX prep '/data/data/su.worldbest.bbdd/cache/ads-1062427778.jar': unzip in 0ms, rewrite 22ms 05-05 15:14:50.330 1386-1405/su.worldbest.bbdd I/Ads﹕ CsiReporterFactory: CSI is not enabled. No CSI reporter created.
Баннера не видно ни на эмуляторе, ни на реальном устройстве. Что делать?


Ответ

Первое время не мог понять почему не виден баннер, хотя делал все по инструкции!
Оказалось, что баннер часто не виден только потому, что, банально, не влазит (по размеру) в то пространство, которое Вы ему отвели. И, в основном, по ширине!
Нужно смотреть размеры и ограничения (особенно padding'и) всех охватывающих его LinearLayout'ов, GridLayout'ов, ScrollView и т.п. Т.е. просмотреть размеры (еще раз: особенно padding'и) всех родительских Layout'ов по всей иерархии общего макета страницы (*.xml)
К сожалению, никаких предупреждений (сообщений) на этот счет не делает Android Studio (3.0.1) до сих пор. А надо бы!!! Пора уже! )

воскресенье, 7 июля 2019 г.

Передать согласие или отказ от предоставления личных данных

Здравствуйте я начинающий разработчик, есть приложение на play market, монетизированное с помощью AdMob. Настроил свое диалоговое окно для согласия или отказа на предоставление личных данных, cookies. Не могу понять как передать эти данные в google, admob согласие или отказ от предоставления личных данных. Спасибо.


Ответ

По дефолту у запроса на рекламу стоит опция PERSONALIZED, что означает - реклама под юзера, следовательно, передавать что-то гуглу надо только в том случае, если юзер из Европы и отказался от предоставления личных данных. Вот так можно сказать гуглу о том, что ты хочешь получать только NON_PERSONALIZED рекламу:
Bundle extras = new Bundle(); extras.putString("npa", "1");
AdRequest request = new AdRequest.Builder() .addNetworkExtrasBundle(AdMobAdapter.class, extras) .build();
Так же хотел бы уточнить по поводу диалогового окна, хоть это не часть вопроса, но всё же регламент серьезный, поэтому решил упомянуть:)
Note: Google's EU User Consent Policy requires that you collect consent for the full list of ad technology providers configured for your publisher IDs before displaying personalized ads, even if you are using a third-party mediation solution to send ad request to Google.
Заметка выше значит, что, чтобы получить согласие на PERSONALIZED рекламу от всех рекламных нетворков по регламенту, их всех нужно указать в диалоговом окне. И, если используется admob mediation, указать admob недостаточно для получения согласия от юзера по закону. Нужно так же указать все нетворки под капотом у admob mediation.

вторник, 26 февраля 2019 г.

Не работает текстовая/видео реклама admob

Обычный баннер работает, а контекстовая реклама и видео не работает(межстраничное объявление). Вообще пустое место ничего вообще не показывает.
main_activity
AdView mAdView = (AdView) findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest);
main.xml
// мой код


Ответ

Видео и межстраничная реклама могут работать только в больших View. У вас же баннер маленький (ads:adSize="BANNER") и они там не поместятся. Засим вам надо или как тут создать отдельную AdView для этих типов реклам или вообще не создавать для них отдельного View, а доверить их создание самому adMob-у, как показано в официальной документации по Interstitial Ads
Также проверьте, что эти типы рекламм включены в вашем аккаунте как показано тут

пятница, 16 ноября 2018 г.

Как запустить рекламу адмоба(видео) при старте приложения?

Ссылка на офф. документацию : https://developers.google.com/admob/android/interstitial
Сделал как там все описано - работает, но только при нажатии кнопки. А как сделать, что бы при каждом запуске приложения отображалась реклама 1 раз?


Ответ

Надо отследить что пользователь открыл приложение, а не (например) повернул. Это можно сделать проверив if(savedInstanceState==null) это аргумент в onCreate методе активити. После её поворота (пересоздания) этот аргумент уже не null и условие выполнено не будет. В этом условии сформировать запрос к AdMob Запустить его и ждать пока реклама не отобразится.
public class MainActivity extends ActionBarActivity { boolean adsAlredyShown = false; InterstitialAd mInterstitialAd;
@Override protected void onCreate(Bundle savedInstanceState) { Log.i("LOG", "onCreate"); super.onCreate(savedInstanceState);
mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); //идентификатор из доков надо заменить на свой mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { Log.i("LOG", "onAdClosed"); }
public void onAdLeftApplication() { Log.i("LOG", "onAdLeftApplication"); }
@Override public void onAdLoaded() { Log.i("LOG", "onAdLoaded"); mInterstitialAd.show(); }
public void onAdFailedToLoad(int errorCode) { Log.e("LOG", "onAdFailedToLoad with errorCode " + errorCode); } @Override public void onAdOpened() { Log.i("LOG", "onAdOpened"); //вызывается в момент отображения рекламы. //и раз она отобразилась ставим флаг в true //чтобы больше её не показывать adsAlredyShown = true; } });
if(savedInstanceState==null) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } else { adsAlreadyShown = savedInstanceState.getBoolean("AdsAlreadyShown", false); //реклама ещё не показывалась if(!adsAlreadyShown) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } } }
protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("AdsAlreadyShown", adsAlreadyShown); } }

Также, в тот же savedInstanceState можно поместить флаг после показа рекламы и не показывать её пока он true. Этот флаг исчезнет только если активити будет убита системой или вручную методом finish()

суббота, 27 октября 2018 г.

Реклама съедает память устройства

Решил я попробовать добавить в одно своё Activity рекламу. Выбор упал на знаменитый AdMob. Всё сделал, реклама работает.
Прошло время, заметил, что приложение стало потреблять больше памяти. Методом поэтапного удаления выяснил, что источник проблем заключается как раз в рекламе, а точнее в нескольких строчках установки рекламы. Вот они сами:
AdView MyBanner = (AdView) findViewById(R.id.MyBanner_id);
MobileAds.initialize(getApplicationContext(), "ca-app-pub-XXX~YYY");
AdRequest adRequest = new AdRequest.Builder() .addTestDevice("ZZZ") .build(); MyBanner.loadAd(adRequest);
Profiler говорит, что без этих строк MEMORY 35mb , со строками 80mb
Вопрос: как иметь рекламу и не тратить так много памяти?


Ответ

AdMob использует WebView для загрузки объявлений. Это довольно ресурсоёмкий объект, который использует собственные библиотеки и подвержен сбоям. У вас нет никакого контроля над тем, как работает Admob SDK. Кроме того, использование памяти, вероятно, будет варьироваться в зависимости от типа объявления: тексты HTML и баннеры с изображениями и т.д.
Так же не стоит забывать про то, что нужно управлять жизненным циклом объявлений
@Override protected void onPostResume() { super.onPostResume();
mAdView.resume();
}
@Override protected void onPause() { super.onPause();
mAdView.pause();
}
@Override protected void onDestroy() { super.onDestroy();
mAdView.destroy();
}
Это должно помочь избежать утечек памяти. С объёмом используемой памяти остаётся только смириться. Можете почитать про AdMob подробнее перейдя по ссылке.

вторник, 16 октября 2018 г.

Google Play, регистрация в Google Merchant, покупки внутри приложения, легальная сторона вопроса

Закончил работу над своим первым приложеним с рекламой и возможностью покупки полной версии без рекламы и с дополнительными функциями, зарегистрировался в google play developer console, все оплатил.
Насколько я понял, что для того чтобы реализовать покупки внутри приложения нужен Google Merchant аккаунт. У меня есть несколько, возможно, глупых вопросов по этому поводу:
У меня пока нет ни вебсайта ни доменного имени и нет пока возможности зарегистрировать (Могу ли я там использовать свою github.io страницу ?) Не совсем понимаю как нужно заполнять всю информацию для регистрации в Google Merchant, у меня нет ни ИП, ни компании. Можно ли обойтись без оформления оных ? Совсем не факт, что с приложения будут приходить значительные деньги, так что не знаю стоит ли все это лишних телодвижений прямо сейчас. Возможно ли сначала выложить работающее приложение, чтобы продажи шли, но не перечислялись на мой банковский счет, а потом уже при достаточной накопленной сумме зарегистрировать ИП, перевести средства на свой счет, заплатить налоги и т.д. ? Если я решу оставить лишь рекламу в приложении без покупки полной версии, нужен ли будет Google Merchant ? И как будет с выводом денег в этом случае ? Насколько я понимаю, деньги могут накапливаться на счете admob и их потом можно когда угодно вывести ? P.S. Нахожусь в России


Ответ

Сайт и домен не нужны - можете или не заполнять или да - гитХаб указать. Ни ИП, ни компания не являются обязательным условием. Думаю, если вы ИП укажете, то не ошибётесь. Да, вы можете копить сколь угодно деньги на гугловом счёту и лишь потом озаботиться созданием счёта своего для вывода. Деньги никуда не денутся. Google Merchant нужен только для получения прибули из самого маркета. Рекламые доходу идут на другие счета и никак с самим маркетом не связаны.
Вот тут есть ещё полезной инфы о выводе денег с AdMob и Google Merchant:
Вывод денег из аккаунтов Google Play и AdMob Регистрация аккаунта разработчика Google Play и вывод денег в России

понедельник, 1 октября 2018 г.

Регистрация аккаунта разработчика Google Play и вывод денег в России

Мне нужно создать аккаунт разработчика в Google Play для того, чтобы выкладывать свои приложения и получать денежные средства с рекламы в этих приложениях. Какой банковский счёт для этого нужен? Где нужно регистрироваться? Какие есть нюансы при выводе денег в России? Я хотел бы поподробнее узнать про регистрацию аккаунта разработчика в Google Play, про то, какая кредитная карта для этого нужна, и где её получить, и про вывод денег в России.


Ответ

Нужна карта с возможностью платить в Интернете для первоначального взноса в 25 долларов в Google Play (заплатить надо всего один раз, в отличие от яблочного акка разработчика, где платить надо раз в год). Лично я пользовался виртуальной QIWI-картой. Для её получения нужна SIM-карта (для регистрации аккаунта в QIWI). Далее, на сайте или в приложении создаёте карту с любыми данными о владельце и платите. Нужен долларовый счёт с возможностью получать доллары из-за границы. Мне помог в этом Сбербанк (счёт открывают за $5, которые оказываются неснимаемой суммой на счету. Счёт называется "Универсальный"). Дали бумажную книжку по паспорту, реквизиты. Ввёл это в аккаунте - деньги пришли. Далее, если хочется удобств - можно оформить сбербанковскую же карту (за 780 рублей в виде страховки единовременной. Далее можно и не платить её. Нужен паспорт). С ней можно в онлайн-банке доллары в рубли перевести на карту и с карты уже в банкомате наличные снять. Либо по старинке отстоять очередь в отделении и снять наличные по паспорту и книжке. Для рекламы нужен отдельный аккаунт. В моём случае - AdMob. Там всё так же, за исключением первоначального взноса. Но есть один нюанс: после достижения некой пороговой суммы доходов за рекламу будет плашка в аккаунте повешена с предложением вбить адрес для высылки бумажного (sic!) письма с пин-кодом, который должен (после его получения и вбития в аккаунте) убедить AdMob в том, что вы реальный человек. Идёт оно из Калифорнии, готовьтесь к его длительному ожиданию. Сама регистрация не сложная. Просто вбиваем запрашиваемые данные.
Итог: Нужны SIM-карта, банковская карта, паспорт РФ, 30 долларов и чуть-чуть прямых рук.
P.S. Вот тут ещё чуть-чуть информации: Вывод денег из аккаунтов Google Play и AdMob

воскресенье, 30 сентября 2018 г.

Регистрация аккаунта разработчика Google Play и вывод денег в России

Мне нужно создать аккаунт разработчика в Google Play для того, чтобы выкладывать свои приложения и получать денежные средства с рекламы в этих приложениях. Какой банковский счёт для этого нужен? Где нужно регистрироваться? Какие есть нюансы при выводе денег в России? Я хотел бы поподробнее узнать про регистрацию аккаунта разработчика в Google Play, про то, какая кредитная карта для этого нужна, и где её получить, и про вывод денег в России.


Ответ

Нужна карта с возможностью платить в Интернете для первоначального взноса в 25 долларов в Google Play (заплатить надо всего один раз, в отличие от яблочного акка разработчика, где платить надо раз в год). Лично я пользовался виртуальной QIWI-картой. Для её получения нужна SIM-карта (для регистрации аккаунта в QIWI). Далее, на сайте или в приложении создаёте карту с любыми данными о владельце и платите. Нужен долларовый счёт с возможностью получать доллары из-за границы. Мне помог в этом Сбербанк (счёт открывают за $5, которые оказываются неснимаемой суммой на счету. Счёт называется "Универсальный"). Дали бумажную книжку по паспорту, реквизиты. Ввёл это в аккаунте - деньги пришли. Далее, если хочется удобств - можно оформить сбербанковскую же карту (за 780 рублей в виде страховки единовременной. Далее можно и не платить её. Нужен паспорт). С ней можно в онлайн-банке доллары в рубли перевести на карту и с карты уже в банкомате наличные снять. Либо по старинке отстоять очередь в отделении и снять наличные по паспорту и книжке. Для рекламы нужен отдельный аккаунт. В моём случае - AdMob. Там всё так же, за исключением первоначального взноса. Но есть один нюанс: после достижения некой пороговой суммы доходов за рекламу будет плашка в аккаунте повешена с предложением вбить адрес для высылки бумажного (sic!) письма с пин-кодом, который должен (после его получения и вбития в аккаунте) убедить AdMob в том, что вы реальный человек. Идёт оно из Калифорнии, готовьтесь к его длительному ожиданию. Сама регистрация не сложная. Просто вбиваем запрашиваемые данные.
Итог: Нужны SIM-карта, банковская карта, паспорт РФ, 30 долларов и чуть-чуть прямых рук.
P.S. Вот тут ещё чуть-чуть информации: Вывод денег из аккаунтов Google Play и AdMob