Error de implementación de Admob

Tengo un problema con la implementación de AdMob en una aplicación.

Este es mi main.xml:

     

y este es mi Manifiesto:

               

Y finalmente esta es mi Actividad:

 public class TestAdmobActivity extends Activity { private AdView adView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Create the adView adView = new AdView(this, AdSize.BANNER, "a14ead58dc2a456"); // Lookup your LinearLayout assuming it's been given // the attribute android:id="@+id/mainLayout" LinearLayout layout = (LinearLayout)findViewById(R.id.linearLayout1); // Add the adView to it layout.addView(adView); // Initiate a generic request to load it with an ad adView.loadAd(new AdRequest());} @Override public void onDestroy() { adView.destroy(); super.onDestroy(); }} 

Ahora, cuando inicie la aplicación en AdView, aparece un error llamado: “debe haber declarado AdActivity en AndroidManifest.xml con configChanges”.

Utilicé Android 4.0, por lo tanto, por encima de 3.2, pero no está funcionando. Espero que alguien pueda ayudarme.

Tuve exactamente el mismo problema al obtener el “debe tener AdActivity declarado en AndroidManifest.xml con configChanges”. mensaje de error después de integrar el último SDK de AdMob. Aunque he encontrado esto y las otras dos discusiones relacionadas (ver enlaces al final de este artículo) en StackOverflow, no me ayudaron a resolver el problema, ya que – para mí – no diferenciaron lo suficientemente claro entre el atributo targetSdkVersion en el manifiesto y el objective de comstackción. Esta respuesta describe qué resolvió el problema para mí y qué causó problemas.

Solución

La parte más fácil al principio: le faltan algunos indicadores en el atributo configChanges de la definición de AdActivity en su AndroidManifest.xml . Tal como se muestra en los documentos del SDK de AdMob, la definición debe verse así:

  

La segunda parte, y la más complicada, está relacionada con el objective del SDK: la única solución que realmente parece funcionar es utilizar el administrador del SDK para instalar el SDK por lo menos en Android 3.2 (API de nivel 13). Después de haber instalado esta versión del SDK, necesita configurar su IDE para construir su proyecto utilizando este SDK. La configuración exacta depende del IDE que esté utilizando. En mi caso, es IntelliJ IDEA y allí encontrará la opción en la configuración del proyecto en la página del Proyecto debajo del título Project SDK .

También debe ajustar la propiedad del target en project.properties su proyecto. Esto es al menos importante si está construyendo su lanzamiento usando ANT. La línea debería verse así:

 target=android-13 

La configuración anterior solo hace el truco. No se requieren cambios en el elemento en el AndroidManifest. Lea las trampas a continuación para saber por qué esto puede causar problemas.

Explicación

El objective de comstackción y los elementos tienen ámbitos completamente diferentes.

Las herramientas de comstackción evalúan el objective de comstackción solo durante el tiempo de comstackción para determinar qué versión de las herramientas de SDK de su sistema se debe usar para construir su aplicación. Cuanto más nuevo sea el SDK, más funciones de API conocerá. Por alguna razón, Google nos obliga a especificar algunos configChanges que no están disponibles antes del nivel 13 de API, por lo que necesitamos construir nuestra aplicación utilizando al menos las herramientas SDK 13 porque una versión anterior de las herramientas SDK no conoce estos nuevos configChanges y reportará un error. En tiempo de ejecución, el objective de comstackción no tiene ningún significado y Android ignorará todos los elementos (por ejemplo, en configChanges ) que no conoce.

El elemento targetSdkVersion especificado en el elemento en el manifiesto de Android en contraste solo se evalúa en tiempo de ejecución, no en tiempo de comstackción. De hecho, puede especificar cualquier valor que desee aquí sin que el comstackdor cambie nada o genere un mensaje de error. Es por eso que cambiar este atributo no nos ayuda a resolver nuestro problema de AdMob. Por otro lado, en tiempo de ejecución, el atributo puede ser evaluado por Android para admitir algunas características de compatibilidad para aplicaciones que han sido comstackdas para versiones anteriores de Android. Vea la sección de trampas a continuación para ver un tema que me causó problemas.

Trampas

  • No cambie set targetSdkVersion a una versión superior si no puede probar su aplicación en esta versión de Android: como he entendido mal las respuestas existentes con respecto a este tema de admob, también configuré el atributo android:targetSdkVersion de elemento para API nivel 13 en mi aplicación que causó un efecto secundario fatal: como Android 3 pensó que mi aplicación sería compatible nativamente con honeycomb, ya no mostraba el botón de menú en la barra de botones suaves en el borde inferior y como mi aplicación oculta el nativo La barra de título para mostrar su propia implementación, el usuario no tenía ninguna posibilidad de acceder al menú en honeycomb. Entonces, para mí, dejar el targetSdkVersion en el nivel 10 ayudó a volver al botón de menú y funcionó bien.
  • Manejo de la compatibilidad con versiones anteriores de las API antiguas que pueden perderse en las herramientas SDK 13: OK, así que configuré mi proceso de comstackción para usar las herramientas SDK 13 y mi targetSdkVersion a 10 y todo debería estar bien, ¿no? ¡Lamentablemente no! La razón es que mi aplicación es compatible a la baja con Android 1.5 (nivel 3 de la API), ya que todavía representa el 5% de mis usuarios. Desafortunadamente, después de establecer el objective de comstackción en 13, algunas partes de mi código no comstackron más ya que hicieron referencia a métodos en desuso que fueron compatibles hasta las herramientas SDK 10 pero que ya no comienzan con las herramientas SDK 11 (por ejemplo, Service.setForeground ).

Aquí se describen los conceptos básicos de cómo manejar la compatibilidad con versiones anteriores, pero este artículo no describe cómo llamar a los métodos obsoletos que ya no están disponibles, ya que causarán un error en el comstackdor. Lo resolví creando un nuevo proyecto de biblioteca utilizado por mi aplicación. Para este proyecto de biblioteca, he establecido el objective de comstackción en 10, lo que hará que se compile utilizando las herramientas de SDK 10 que todavía se conocen acerca de la API desaprobada de Android que estoy usando. Luego, mi aplicación llama a los métodos de ayuda de esta biblioteca de compatibilidad y puedo comstackr mi aplicación con un SDK de destino más nuevo.


Temas relacionados

Aquí la lista de las otras discusiones relacionadas que he encontrado:

  • AdMob no puede mostrar anuncios debido a configChanges
  • AdMob SDK 4.3.1 – No puedo mostrar el banner

Mi solución para un caso similar fue usar

o simplemente usa android: targetSdkVersion = menor de 13

También debe configurar los siguientes permisos en su AndroidManifest.xml.

   

Entonces admob puede evaluar Internet y no mostrar el anuncio cuando no tiene conectividad a Internet.

¿También has establecido que tu objective de comstackción sea superior a Android 3.2, es decir, en default.properties establezca un objective más alto que android-13? También asegúrese de estar utilizando la última versión del SDK.

¡PD! No exponga su ID de dispositivo al público.

Como puede ver aquí, muy pocos teléfonos tienen versiones de Android 3.xx o superiores instaladas

http://developer.android.com/resources/dashboard/platform-versions.html

¿Por qué alguien querría comstackr su aplicación para algo que pocos teléfonos pueden manejar? O estoy malinterpretando algo o tendré que buscar alguna otra compañía publicitaria que no requiera una versión más nueva de Android.

El error anterior se produce cuando utiliza la biblioteca GoogleAdMobAdsSdk-4.3.1.jar. He cometido ese error y he encontrado esta demostración de Google . He reemplazado lib 4.3.1 por 4.0.3 en esta demostración y se ejecuta OK.

si usa AndroidStudio y Gradle, también debe actualizar el archivo build.gradle de la siguiente manera:

 android { compileSdkVersion 17 buildToolsVersion "18.0.1" defaultConfig { minSdkVersion 3 targetSdkVersion 17 } ...