«

»

may 06 2012

Monetizando nuestras Apps: AdMob en Android

 

A la hora de enfrentarnos a los desarrollos no lo hacemos por amor al arte (o quizas si), no obstante necesitamos encontrar formas de monetizar nuestras apss y hacer que estos desarrollos sean rentables y mantenibles para poder continuar con ellos. Llegados este punto encontramos varias alternativas, apps de pago, modelo freemium, venta de servicio o ingresos por publicidad. En este caso os contaremos como usar el servicio AdMob de Google para inclusión de publicdad en nuestras apps y así poder ingresar unos eurillos.

 

¿COMO FUNCIONA?


Los banners de anuncios de Google AdMob usan una pequeña parte de la pantalla para atraer a los usuarios para que “hagan clic” y se dirijan a una experiencia de contenido multimedia de pantalla completa, tal como un sitio web o una página de App Store.

 

Para mostrar banners en su aplicación Android, solo tiene que incorporar el SDK en su proyecto de Eclipse y añadir una com.google.ads.AdView a su interfaz de usuario.

 

NOTA: El SDK de anuncios de Google AdMob para Android requiere Android 1.5 o superior. Asegúrese de tener la copia más reciente del SDK de Android y de compilar para Android v3.2 (configure target de default.properties en android-13).

 

 

MANOS A LA OBRA


Una vez hemos descargado Google AdMob Ads SDK y lo hemos incluido en el BuildPath deberemos hacer unos cambios en AndroidManifest.xml para que todo funcione.

 

El SDK de anuncios de AdMob requiere que se declare com.google.ads.AdActivity en el archivo AndroidManifest.xml de su aplicación:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.company"
          android:versionCode="1" android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name"
               android:debuggable="true">
    <activity android:label="@string/app_name" android:name="BannerExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <activity android:name="com.google.ads.AdActivity"
              android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
  </application>
</manifest>

 

Si desea realizar solicitudes de anuncios, es necesario tener los permisos de red INTERNET y ACCESS_NETWORK_STATE, por lo tanto, estos permisos también deben declararse en el archivo de manifiesto:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.company"
          android:versionCode="1" android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name"
               android:debuggable="true">
    <activity android:label="@string/app_name" android:name="BannerExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <activity android:name="com.google.ads.AdActivity"
              android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
  </application>
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>

 

 

INCLUYENDO LA AdView VÍA CÓDIGO

 

Las cinco líneas del código necesarias para añadir un banner:

  • Importar com.google.ads.*
  • Declarar una instancia de AdView
  • Crearlo, especificando un ID de bloque (su ID de editor de AdMob)
  • Añadir la vista a la interfaz de usuario
  • Cargarlo con un anuncio

Aquí un ejemplo de código:

import com.google.ads.*;

public class BannerExample extends Activity {
  private AdView adView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Crear la adView
    adView = new AdView(this, AdSize.BANNER, MY_AD_UNIT_ID);

    // Buscar el LinearLayout suponiendo que se le haya asignado
    // el atributo android:id="@+id/mainLayout"
    LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout);

    // Añadirle la adView
    layout.addView(adView);

    // Iniciar una solicitud genérica para cargarla con un anuncio
    adView.loadAd(new AdRequest());
  }

  @Override
  public void onDestroy() {
    adView.destroy();
    super.onDestroy();
  }
}

 

A la hora de hacer pruebas nos podrían llegar banear la cuenta de AdMob por clicks indebidos, es por ello que es importante indicar en estos casos que nos encontramos realizando test en la App. Para ello parametrizamos la AdRequest de la siguiente manera:

AdRequest adRequest = new AdRequest();
adRequest.addTestDevice(AdRequest.TEST_EMULATOR);               // Emulador
adRequest.addTestDevice("TEST_DEVICE_ID");                      // Probar dispositivo Android

 

 

INCLUYENDO LA AdView VÍA XML


Otra alternativa es incluir nuestros anuncios en el fichero de definición del layout e indicar que lo cargue automáticamente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
  <com.google.ads.AdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="MY_AD_UNIT_ID"
                         ads:adSize="BANNER"
                         ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID"
                         ads:loadAdOnCreate="true"/>
</LinearLayout>

 

Si quisiéramos gestionar el momento en que se cargan los anuncios podríamos hacerlo mediante el código:

import com.google.ads.*;

public class BannerExample extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Buscar la AdView como un recurso y cargar una solicitud.
    AdView adView = (AdView)this.findViewById(R.id.adView);
    adView.loadAd(new AdRequest());
  }
}

 

 

ID’S


  • MY_AD_UNIT_ID: Es el ID de Editor asociado en nuestra cuenta de AdMob, para encontrarlo accedemos a AdMob y una vez creada nuestro perfil de la App podremos verlo.
  • TEST_DEVICE_ID: Puede encontrar el ID de dispositivo en el resultado de logcat solicitando un anuncio al depurar en el dispositivo.

 

 

EL RESULTADO



Nota: es posible que la recepción de un anuncio se demore hasta dos minutos la primera vez que AdMob vea su ID de editor. Este lapso de dos minutos inicial se repetirá siempre que deje de usar el ID durante 24 horas.

 

 

vía | Ingens Blog

web | AdMob

download | SDK

más info | Recomendaciones

Guía | Nivel intermedio

Guía | Nivel avanzado

 

Acerca del autor

JMPergar

Mobile Developer at @BeRepublic & Founder of @AndroCode. Silver Speaker & Member of Core Team at @GDGBarcelona.

  • Juan

    Hola, he leido el tutorial y me interesa pero tengo un problemilla. Cuando me creo una cuenta en AdMob me dice que indique mi empresa y mi código ID o un código similar. El problema es que yo no pertenezco a ninguna empresa ni se de que numero habla ya que no trabajo, soy estudiante. Entonces, que datos introduzco? Luego cuando en forma de pago elijo PayPal me pide inicio de sesión, que introduzco el correp al que tengo asociada la cuenta de PayPal?
    Gracias:)

    • http://www.linkedin.com/in/jmpergar JMPergar | Editor Jefe

      Si no eres una empresa pues no pones nada, o si es obligatorio pones tu nombre, y el ID pues tu DNI. En cuanto a lo de PayPal no lo he tratado, pero supongo que si, que tendras que poner tu mail o nombre de usuario en PayPal.

  • http://www.victorpascual.es Victor

    Buenas, llevo unos días liado con la publicidad y no consigo que me funcione. Me aparece siempre un error de ejecución de la app y no encuentro la forma de solventarlo. Uso la versión 4.1 y por supuesto siempre la última versión del SDK de Admob.
    mi pregunta es…¿qué versión hay que usar de Android que sea compatible cien por cien con Admob?
    Gracias de antemano! :)

    • http://www.linkedin.com/in/jmpergar JMPergar | Editor Jefe

      El SDK de anuncios de Google AdMob para Android requiere Android 1.5 o superior. Asegúrese de tener la copia más reciente del SDK de Android y de compilar para Android v3.2 (configure target de default.properties en android-13).

  • Jorge

    Hola, estoy implementando una app con 1.6 , entonces para introducir esto afecta algo a la versión de la app? es decir, que cambie la version del tarjet para la complación, luego requiere que la version minima sera la 3.2?

    • http://www.linkedin.com/in/jmpergar JMPergar | Editor Jefe

      El SDK de anuncios de Google AdMob para Android requiere Android 1.5 o superior.

  • Igor

    Hola, ante todo gracias por poner un poco de luz en esto de la publicidad. Estoy intentando hacer un proyecto con tu ejemplo en Eclipse pero cuando pongo en el manifest

    me da error y si pongo por ejemplo, no me da error pero a la hora de ejecutar donde debiera salir el anuncio me sale el mensaje siguiente:

    “You must have AdActivity declared in AndroidManifest.xml with configChanges”

    Ojalá me puedas ayudar, un saludo

    • http://www.linkedin.com/in/jmpergar JMPergar | Editor Jefe

      Lo siento pero creo que el comentario no ha salido completo y faltan partes :(

  • Eje

    Muchas gracias por tu tutorial.
    He seguido todos los pasos: he utilizado el sdk 6.2.1 descargado hoy mismo, añadido al build path, agregado el com.google.ads.AdActivity y los dos permisos en el manifest, y agregado el adview vía xml, y luego en el activity inicial de la aplicación hago el loadAd. Pero cuando arranco la aplicación para comprobar su funcionamiento salta el error: Error inflating class com.google.ads.AdView.
    Lo único que no estoy seguro de haber entendido del tutorial es el tema de la versión de compilación. Yo tengo en mi manifest que el targetSdkVersion es 15 y la minSdkVersion es la 10, que creo que corresponden a las versiones 2.3.3 y 2.2. Por un lado ambas son inferiores a la versión 3.2 que dices, aunque la versión 15 es superior a la 13 que indicas que habría que poner. Además no encuentro dónde cambiar las opciones de compilación de la aplicación, ya que sólo te pregunta esos datos al crearla y, por más vueltas que doy, no encuentro la forma de cambiarlo a la 3.2 ahora que está terminada.

    • Eje

      Me autorrespondo porque he seguido investigando y casi lo tengo.
      Vi que me daba error el android:configchanges por un par de términos, (screenSize y smallestScreenSize) así que los eliminé y de esa forma conseguí que arrancara en un emulador de la 2.3.3, aunque en lugar de publicidad me mostraba un mensaje diciendo que configchanges tenía que contener esos dos términos. Mirando por internet al parecer dichos términos sólo aparecen a partir de la versión 3.2 de android.
      He cambiado la aplicación para que la versión con la que compile sea la 3.2 (aunque sigue con la 2.3.3 (15) como versión objetivo y la 2.2 (8) como versión mínima), pero para ello he tenido que actualizar el sdk que uso y crear un emulador de la 3.2. Así que como ha tardado en descargar todo, y como los emuladores tardan tanto en arrancar, no me ha dado tiempo a poder probarlo. Espero poder hacerlo esta noche, que funcione correctamente y que sirva también para las versiones de la 2.2 en adelante, y no únicamente para la 3.2.

      • Eje

        Finalmente he conseguido hacerlo funcionar, pero extrañamente me resulta imposible ponerlo en la parte de abajo de la pantalla. En la parte superior del layout funciona perfectamente. Pues si cojo el AdView y lo muevo a la parte inferior, sin tocar nada más, me da el siguiente error al arrancar la aplicación:

        AndroidRuntime(396): FATAL EXCEPTION: main

        AndroidRuntime(396): java.lang.RuntimeException: Unable to start activity ComponentInfo{ejepsi.neumaticos_compatibles/ejepsi.neumaticos_compatibles.Principal}: java.lang.ClassCastException: android.widget.Spinner

        AndroidRuntime(396): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)

        AndroidRuntime(396): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

        AndroidRuntime(396): at android.app.ActivityThread.access$1500(ActivityThread.java:117)

        AndroidRuntime(396): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

        AndroidRuntime(396): at android.os.Handler.dispatchMessage(Handler.java:99)

        AndroidRuntime(396): at android.os.Looper.loop(Looper.java:123)

        AndroidRuntime(396): at android.app.ActivityThread.main(ActivityThread.java:3683)

        AndroidRuntime(396): at java.lang.reflect.Method.invokeNative(Native Method)

        AndroidRuntime(396): at java.lang.reflect.Method.invoke(Method.java:507)

        AndroidRuntime(396): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

        AndroidRuntime(396): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

        AndroidRuntime(396): at dalvik.system.NativeStart.main(Native Method)

        AndroidRuntime(396): Caused by: java.lang.ClassCastException: android.widget.Spinner

        AndroidRuntime(396): at ejepsi.neumaticos_compatibles.Principal.onCreate(Principal.java:32)

        AndroidRuntime(396): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

        AndroidRuntime(396): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

        AndroidRuntime(396): … 11 more

        Ads(396): adRequestUrlHtml: AFMA_getSdkConstants();AFMA_buildAdURL({“preqs”:0,”session_id”:”13743979065035527071″,”seq_num”:”1″,”slotname”:”a15097dd1c1613f”,”u_w”:320,”msid”:”ejepsi.neumaticos_compatibles”,”cap”:”m,a”,”js”:”afma-sdk-a-v6.2.1″,”bas_off”:0,”net”:”ed”,”app_name”:”2.android.ejepsi.neumaticos_compatibles”,”hl”:”es”,”gnt”:3,”carrier”:”310260″,”u_audio”:4,”kw”:[],”u_sd”:1.5,”simulator”:1,”isu”:”B3EEABB8EE11C2BE770B684D95219ECB”,”cipa”:0,”format”:”320x50_mb”,”oar”:0,”ad_pos”:{“height”:0,”visible”:0,”y”:0,”x”:0,”width”:0},”u_h”:533,”bas_on”:0,”ptime”:0});

        Process(396): Sending signal. PID: 396 SIG: 9

        Por más vueltas que le doy no consigo encontrar el fallo, ya que como os digo, en la parte superior de la página funciona perfectamente.
        ¿Alguna idea?

        • http://www.linkedin.com/in/jmpergar JMPergar

          La verdad que a mi tampoco se me ocurre el porque, si me pasas los dos xml puedo mirar en mas profunidad a ver si veo algo que se te haya pasado.

          • Eje

            El layout es sencillo:

            Bajo eso sólo está la declaración de un TextView, 3 Button y el cierre del linearlayout.

            Y al final del método onCreate del activity que usa ese layout:

            AdView adView = (AdView)this.findViewById(R.id.Anuncio);
            adView.loadAd(new AdRequest());

            Así funciona perfectamente. Pero si intento mover el AdView a la parte de abajo, ya sea poniéndolo al final del linearlayout o poniendo su Gravity en bottom, me sale el error que he puesto arriba.
            Por más que intento encontrar a qué puede deberse, sigo sin encontrarle la lógica.
            Gracias aunque sea sólo por echarle un vistazo a ver por qué puede ser.

  • Fernando

    Si creo app con APP INVENTOR, puedo meterle publicidad? Gracias y saludos.

    • http://www.linkedin.com/in/jmpergar JMPergar

      Pues la verdad es que nunca he creado una app con APP INVENTOR y ni siquiera conozco hasta que nivel te deja tocar esta metodología, a ver si algunos de los demás lectores te puede echar un cable.

  • Jose Manuel

    Buenas, ya se que te han preguntado esto antes, pero sigo con el mismo problema de que no se que tengo que poner como inicio de sesion de paypal, tengo mas de 21 dolares acumulados en los ingresos, y no se como transferirlos a mi cuenta paypal, le tengo puesto mi correo. Tengo que hacer algo para mandar la transferencia?

    Gracias.

    • http://www.linkedin.com/in/jmpergar JMPergar

      No he llegado a tratar estos temas, espero que algún otro lector te pueda echar un cable.

  • Pingback: Admob not shown - How-To Video()

  • Pingback: Admob not shown : Android Community - For Application Development()

  • Pingback: Admob not shown | BlogoSfera()

  • http://www.facebook.com/RichardSuarez62 Richy Suarez

    Hola, me gustaría saber si se puede implementar la publicidad de este modo, trabajando desde Unity 3d, muchas gracias

  • http://cubo2d.com.ve Daniel Pernia

    Hola tengo aproximadamente 1 mes con admob, aun no me pagan, tengo una duda he notado un alto porcentaje de clics en las impresiones de lugares desconocidos, mas de 70%.

    No se si esto sea normal. pero me preocupa que google crea que estoy haciendo algo fraudulento.
    a alguien mas le a pasado? sera que tengo que comunicarme con ellos y contarle mi inquietud ?

  • http://kidstecnologia.com Juarez

    SETUP ADMOB FOR GAMEMAKER PROFISSIONAL.. PLEASE!

  • seudock

    alguien me puede decir si es posible poner publicidad de admob en appinventor 2