2010-12-28 20 views
29

Estoy integrando AdMob en mi aplicación y me pregunto cómo desactivarlos correctamente. Quiero darle al usuario la posibilidad de desactivarlos. No deseo tener ningún problema con AdMob debido a impresiones incorrectas. ¿Es esto correcto o debería considerar algo?Inhabilita correctamente los anuncios de AdMob

AdView ads = (AdView) findViewById(R.id.ad); 
ads.setEnabled(false); 
+2

Espera. ¿Ganas dinero con Ads y dejas que el usuario los deshabilite si así lo desean? ¿O tienen que pagar para desactivar los anuncios? –

+21

No quiero ganar dinero con los anuncios. Pero quiero darle al usuario la capacidad de admitir más desarrollo de aplicaciones mostrando los anuncios. – Mark

Respuesta

27

En el archivo de diseño (por ejemplo, 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> 

Luego, en su código (por ejemplo, dentro de un bloque "if")

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

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

adscontainer.removeView(admobAds); 

Esto "permanente" (para el ciclo de vida de la aplicación) elimine los anuncios del layou, lo que significa que no se solicitarán anuncios.

+0

sí, pero si uso un diseño xml, ¿cómo lo vuelvo a agregar? – max4ever

+0

@ max4ever simplemente agregue la vista mediante programación cuando lo necesite (o agregue un diseño con solo la vista de anuncio e infle programáticamente dentro del contenedor del grupo de visualización). Supongo que agregar/eliminar no se debe invocar tantas veces, de lo contrario es mucho más simple establecer la visibilidad como desaparecida/visible.Si solo se llama un par de veces, entonces sí, agréguelo programáticamente y quítelo como se sugiere arriba. – RJFares

1

setVisibilidad (VIEW.GONE); eliminará la vista previa del diseño.

Puede que haya que eliminarlo por completo del diseño, pero nunca tuve que hacer eso.

0

No estoy seguro de si el diseño se modifica después de eliminar la vista de anuncio; si no lo hace, puede crear un diseño idéntico (a excepción del anuncio que falta). En su OnCreate, seleccione el diseño adecuado. Luego, solo necesita asegurarse de que se active un cambio de configuración después de que el usuario haga la selección (puede que ya ocurra dependiendo de cómo los dejó seleccionar, por ejemplo, regresar de una pantalla de preferencias).

3
  1. Cree una nueva clase derivada de 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. en su XML definir su anuncio utilizando MyAdView en lugar de la habitual AdView y establecer el atributo loadAdOnCreate-false, por ejemplo .;

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

Entonces, dependiendo del valor de MyApp.m_ads_enabled Cuando se llama a setContentView() los anuncios se publicarán estén habilitadas o activadas.

Este enfoque tiene la ventaja de que, con anuncios desactivados, no se usará ancho de banda de datos ya que el anuncio nunca se solicita, esto puede ser importante para alguien con un contrato de datos PAYG o limitado.

+0

Funciona para mí :) Gracias – MBH

25

También quería ofrecer a los usuarios la posibilidad de desactivar anuncios: ¿por qué obligar a las personas a verlos si no quieren? y por qué debería esperar que las personas paguen por esa opción?

De todos modos, esbocé cómo hice esto en this article.El artículo entra en más detalles, pero aquí de las partes pertinentes:

El código que utilizo para desactivar los anuncios:

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

para que se conviertan de nuevo en (en caso de que alguien se sentía generoso)

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

¿La visibilidad cambia lo suficiente? Al configurar la visibilidad GONE, aún se conserva vivo el objeto de vista. Es libre de hacer solicitudes de anuncios, actualizaciones, etc. La eliminación de la vista es un mejor enfoque. – rpattabi

0

Lo habría agregado como un comentario a la respuesta de Quartertones, pero no tengo una calificación de 50: No creo que esto deshabilite los anuncios permanentemente. Usé el siguiente interruptor para encenderlos o apagarlos cuando y cuando lo desee. Por un lado desactivo los anuncios en la vista y utilizar la otra para rellenar los anuncios ...

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

    } 
2

Desafortunadamente el combo setVisibility(View.GONE); + setEnabled(false) no funciona universalmente en todas las versiones/dispositivos android. Dependiendo de cuándo lo invoque, puede terminar colgado en la pantalla vacía (sin NPE, solo pantalla en blanco).

Hasta ahora la única solución que funciona para mí es:

Para la Actividad:

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

Para Fragmento:

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

Esta solución se basa en @ respuesta de Quartertone sino que se extendió a ser más universal (es decir, funciona con todos ViewGroup s no solo LinearLayout). Simplemente ponga estos métodos en sus clases de Actividad/Fragmento base.

0

hacer una clase que se llama Ads como éste

`Anuncios clase pública { 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); 
    } 
    } 

importarlo en la clase en la que desea elimine una AdView de use Ads.Remove(AdView, parent); para eliminarla. Ads.Remove("the add view itself", the ViewGroup or layout where it is");

1

Dale todo lo que tienes, sólo para estar en el lado seguro:

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

sólo la creación de la visibilidad de la vista a IDO es suficiente.

Si lee la salida de Logcat, imprime "I/Anuncios: el anuncio no está visible. Anuncio no refrescante"..

Cuestiones relacionadas