Подтвердить что ты не робот

Правильно отключите объявления AdMob

Я интегрирую AdMob в свое приложение, и мне интересно, как правильно отключить рекламу. Я хочу дать пользователю возможность отключить их. Я не хочу иметь никаких проблем с AdMob из-за неправильных показов. Правильно ли это или я должен что-то рассмотреть?

AdView ads = (AdView) findViewById(R.id.ad);
ads.setEnabled(false);
4b9b3361

Ответ 1

В вашем файле макета (например, main.xml):

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/adsContainer">

    <com.admob.android.ads.AdView 
        android:id="@+id/admobAds" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        app:backgroundColor="#000000" 
        app:primaryTextColor="#FFFFFF" 
        app:secondaryTextColor="#CCCCCC">

</LinearLayout>

Затем в вашем коде (например, внутри блока "if" )

(LinearLayout) adscontainer = (LinearLayout) findViewById(R.id.adsContainer);

View admobAds = (View) findViewById(R.id.admobAds);

adscontainer.removeView(admobAds);

Это будет "надолго" (для жизненного цикла приложения) удалите объявления из layou, а это означает, что объявления не будут запрашиваться.

Ответ 2

Я также хотел дать пользователям возможность отключать рекламу - зачем заставлять людей видеть их, если они этого не хотят? и почему вы должны ожидать, что люди будут платить за этот вариант?

В любом случае, я рассказал, как я сделал это в в этой статье. Статья более подробно, но здесь соответствующие части:

Код, который я использую для отключения рекламы:

private void hideAd() {
    final AdView adLayout = (AdView) findViewById(R.id.adView1);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adLayout.setEnabled(false);
            adLayout.setVisibility(View.GONE);
        }
    });
}

И вернуть их обратно (в случае, если кто-то чувствует себя великодушным)

private void showAd() {
    final AdView adLayout = (AdView) findViewById(R.id.adView1);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adLayout.setEnabled(true);
            adLayout.setVisibility(View.VISIBLE);
            adLayout.loadAd(new AdRequest());
        }
    });
}

Ответ 3

  • Создайте новый класс, созданный из AdView;

    package com.MyApp;
    
    import android.app.Activity;
    import android.content.Context;
    import android.util.AttributeSet;
    
    import com.google.ads.AdRequest;
    import com.google.ads.AdSize;
    
    public class MyAdView extends com.google.ads.AdView {
    
    public MyAdView(Activity activity, AdSize adSize, String adUnitId) {
        super(activity, adSize, adUnitId);
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
    public MyAdView(Context context, AttributeSet attrs) 
    {
        super(context, attrs); 
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
    MyAdView(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
  • в вашем XML укажите свое объявление с помощью MyAdView, а не обычного AdView и установите для атрибута loadAdOnCreate значение false, например.

<com.MyApp.MyAdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="0"
                         ads:adSize="BANNER"
                         ads:loadAdOnCreate="false"/>

Затем, в зависимости от значения MyApp.m_ads_enabled, когда вы вызываете setContentView(), объявления будут либо отключены, либо активированы.

Этот подход имеет то преимущество, что при отключенных объявлениях пропускная способность не будет использоваться, поскольку объявление никогда не запрашивается, это может быть важно для кого-то из ограниченного или PAYG-контракта.

Ответ 4

К сожалению, комбо setVisibility(View.GONE); + setEnabled(false) не работает повсеместно на всех версиях и устройствах Android. В зависимости от того, когда вы его вызываете, вы можете повесить его на пустой экран (без NPE, только пустой экран).

Пока единственным решением, которое работает для меня, является:

За активность:

protected void removeAdView(int adViewId) {
    View view = getWindow().getDecorView();
    View adView = view.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Для фрагмента:

protected void removeAdView(View topView, int adViewId) {
    View adView = topView.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Это решение основано на ответе @Quarttone, но расширено, чтобы быть более универсальным (т.е. работает со всеми ViewGroup не только LinearLayout). Просто поместите эти методы в свои классы Activity/Fragment.

Ответ 5

setVisibility (VIEW.GONE); удалит рекламный блок из макета.

Возможно, удастся полностью удалить его из макета, но мне никогда не приходилось это делать.

Ответ 6

Дайте все, что у вас есть, чтобы быть в безопасности:

if (mAdView != null) {
    mAdView.setEnabled(false);
    mAdView.setVisibility(View.GONE);

    ViewGroup parent = (ViewGroup) mAdView.getParent();
    if (parent != null) parent.removeView(mAdView);

    mAdView.removeAllViews();
    mAdView.destroy();
}

Ответ 7

Я не уверен, что макет переполняется после удаления рекламного объявления; если нет, вы можете создать идентичный (за исключением недостающего объявления) макет. В своем OnCreate выберите правильный макет. Затем вам просто нужно убедиться, что изменение конфигурации запускается после того, как пользователь делает выбор (возможно, это происходит в зависимости от того, как вы разрешаете им выбирать - например, при возврате с экрана предпочтений).

Ответ 8

Я бы добавил это в качестве комментария к Quartertones, но у меня нет рейтинга 50: Я не думаю, что это отключает объявления навсегда. Я использовал следующий переключатель, чтобы включить или выключить их по мере необходимости. С одной стороны я отключу рекламу в представлении и использую другую, чтобы заполнить Объявления...

    if (AdsNeeded)
    {
        AdRequest adRequest = new AdRequest.Builder()
        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
        .addTestDevice("ABC1234567890ABC1234567890") 
        .build();

        AdView adMobAds = (AdView) this.findViewById(R.id.adMobAds);
        adMobAds.loadAd(adRequest);

    }
    else
    {
        LinearLayout adsContainer = (LinearLayout)findViewById(R.id.adsContainer);

        AdView adMobAds = (AdView) this.findViewById(R.id.adMobAds);
        adsContainer.removeView(adMobAds);

    }

Ответ 9

Сделайте класс, который называется Ads как это

`public class Ads {   public static boolean Show (AdView mAdView) {

    if(mAdView != null){
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
        return true;
    }
    return false;
    }
public static void Remove(AdView mAdView,ViewGroup parent){
    root.removeView(mAdView);
    }
public static void Remove(AdView mAdView,RelativeLayout mLayout){
    mLayout.removeView(mAdView);
    }
public static void Remove(AdView mAdView, LinearLayout mLayout){
    mLayout.removeView(mAdView);
    }
  }

Теперь импортируйте его в класс, где вы хотите удалить AdView из используйте Ads.Remove(AdView, parent); чтобы удалить его. Ads.Remove("the add view itself", the ViewGroup or layout where it is");

Ответ 10

Просто установить видимость вида GONE достаточно.

Если вы читаете вывод Logcat, он печатает "I/Ads: объявление не отображается. Не обновляйте объявление"..