web-dev-qa-db-fra.com

Désactivez correctement les annonces AdMob

J'intègre AdMob dans mon application et je me demande comment désactiver correctement les annonces. Je veux donner à l'utilisateur la possibilité de les désactiver. Je ne souhaite pas rencontrer de problèmes avec AdMob en raison d'impressions erronées. Est-ce correct ou dois-je envisager quelque chose?

AdView ads = (AdView) findViewById(R.id.ad);
ads.setEnabled(false);
37
Mark

Dans votre fichier de mise en page (par exemple, 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>

Puis dans votre code (par exemple, à l'intérieur d'un bloc "if")

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

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

adscontainer.removeView(admobAds);

Cela supprimera "définitivement" (pour le cycle de vie de l'application) les annonces du layou, ce qui signifie qu'aucune annonce ne sera demandée.

35
Quartertone

Je voulais également donner aux utilisateurs la possibilité de désactiver les publicités - pourquoi forcer les gens à les voir s'ils ne le veulent pas? et pourquoi devriez-vous vous attendre à ce que les gens paient pour cette option?

Quoi qu'il en soit, j'ai expliqué comment je l'ai fait dans cet article . L'article va plus en détail, mais voici les parties pertinentes:

Le code que j'utilise pour désactiver les publicités:

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

Et pour les rallumer (au cas où quelqu'un se sentirait généreux)

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());
        }
    });
}
27
Chris Dryden
  1. Créez une nouvelle classe dérivée d'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);
        }
    }
    
  2. dans votre XML, définissez votre annonce à l'aide de MyAdView plutôt que de l'habituel AdView et définissez l'attribut loadAdOnCreate sur false, par exemple;

<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"/>

Ensuite, selon la valeur de MyApp.m_ads_enabled Lorsque vous appelez setContentView() les annonces seront désactivées ou activées.

Cette approche présente l'avantage que, lorsque les annonces sont désactivées, aucune bande passante de données ne sera utilisée car l'annonce n'est jamais demandée, cela peut être important pour une personne ayant un contrat de données limité ou PAYG.

3
Steve Monks

Malheureusement, le combo setVisibility(View.GONE); + setEnabled(false) ne fonctionne pas universellement sur tous les Android versions/appareils. Selon le moment où vous l'invoquez, vous risquez de vous retrouver pendu) dans un écran vide (pas de NPE, juste un écran vide).

Jusqu'à présent, la seule solution qui fonctionne pour moi est:

Pour l'activité:

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

Pour le fragment:

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

Cette solution est basée sur la réponse de @ Quartertone mais étendue pour être plus universelle (c'est-à-dire qu'elle fonctionne avec tous les ViewGroups pas seulement LinearLayout). Mettez simplement ces méthodes dans vos classes d'activité/fragment de base.

3
Ognyan

Il suffit de définir la visibilité de la vue sur DISPARU suffit.

Si vous lisez la sortie Logcat, elle imprime "I/Ads: l'annonce n'est pas visible. Annonce non rafraîchissante.".

1
Benjiko99

Donnez tout ce que vous avez, juste pour être sûr:

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();
}
1
lenooh

Créez une classe qui s'appelle Ads comme ceci

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

Maintenant, importez-le dans la classe dans laquelle vous souhaitez supprimer une AdView, utilisez Ads.Remove(AdView, parent); pour la supprimer. Ads.Remove("the add view itself", the ViewGroup or layout where it is");

0
Ahmed I. Elsayed

Je ne suis pas sûr que la mise en page soit redistribuée après avoir supprimé l'avis; si ce n'est pas le cas, vous pouvez créer une mise en page identique (à l'exception de l'annonce manquante). Dans votre OnCreate, sélectionnez la mise en page appropriée. Ensuite, il vous suffit de vous assurer qu'un changement de configuration est déclenché après que l'utilisateur a fait la sélection (peut déjà se produire en fonction de la façon dont vous le laissez sélectionner - par exemple, en revenant d'un écran de préférence).

0

setVisibility (VIEW.GONE); supprimera l'avis de la mise en page.

Il est peut-être possible de le supprimer complètement de la mise en page, mais je n'ai jamais eu à le faire.

0
HaMMeReD