Ошибка реализации Admob

У меня возникла проблема с внедрением Admob в приложение.

Это мой main.xml:

     

и это мой манифест:

               

И, наконец, это моя деятельность:

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

Теперь, когда я запустил приложение в AdView, вы получите ошибку: «вы должны иметь AdActivity, объявленный в AndroidManifest.xml с помощью configChanges».

Я использовал Android 4.0 выше 3.2, но он не работает. Надеюсь, кто-нибудь сможет мне помочь.

У меня была точно такая же проблема с получением «у вас должна быть AdActivity, объявленная в AndroidManifest.xml с помощью configChanges». сообщение об ошибке после интеграции последнего SDK AdMob. Несмотря на то, что я нашел это и два других связанных между собой обсуждения (см. Ссылки внизу этой статьи) в StackOverflow, они не помогли мне решить проблему, поскольку – для меня – они не различали достаточно ясно между атрибут targetSdkVersion в манифесте и цель сборки. Этот ответ описывает, что решило проблему для меня и что вызвало проблемы.

Решение

Простейшая часть сначала: вам не хватает нескольких флагов в configChanges определения AdActivity в вашем AndroidManifest.xml . Как показано в Документах SDK AdMob, определение должно выглядеть так:

  

Вторая – и более сложная часть – связана с целью SDK: единственным решением, которое действительно работает, является использование диспетчера SDK для установки SDK по крайней мере для Android 3.2 (уровень API 13). После того, как вы установили эту версию SDK, вам необходимо настроить среду IDE для создания своего проекта с помощью этого SDK. Точная настройка зависит от используемой среды IDE. В моем случае это IntelliJ IDEA, и там вы найдете вариант в настройках проекта на странице проекта под заголовком Project SDK .

Вы также должны настроить target свойство в project.properties вашего проекта. Это, по крайней мере, важно, если вы создаете свой релиз с помощью ANT. Строка должна выглядеть так:

 target=android-13 

Конфигурация выше сама по себе делает трюк. Для элемента в AndroidManifest нет изменений. Прочтите ловушки ниже, чтобы узнать, почему это может вызвать проблемы.

объяснение

objective сборки и элементы имеют совершенно разные области.

objective сборки оценивается только по времени сборки средствами сборки, чтобы определить, какая версия инструментов SDK в вашей системе должна использоваться для создания вашего приложения. Чем выше SDK, тем больше функций API он знает. По какой-то причине Google заставляет нас указывать некоторые configChanges которые недоступны до уровня API 13, поэтому нам нужно создать наше приложение, используя хотя бы инструменты SDK 13, потому что предыдущая версия инструментов SDK не знает этих новых configChanges и сообщит об ошибке. Во время выполнения цель сборки не имеет никакого значения, и Android игнорирует все элементы (например, в configChanges ), которые он не знает.

Элемент targetSdkVersion, указанный в элементе в манифесте Android в отличие, оценивается только во время выполнения, а не во время компиляции. Фактически вы можете указать любое значение, которое вы хотите здесь, без компилятора, изменяющего что-либо, или сообщения об ошибке. Вот почему изменение этого атрибута не помогает нам решить нашу проблему AdMob. С другой стороны, во время выполнения атрибут может быть оценен андроидом для поддержки некоторых функций совместимости для приложений, которые были созданы для старых версий Android. См. Раздел «Ловушки» ниже, чтобы увидеть тему, которая вызвала у меня проблемы.

Ловушки

  • Не изменяйте set targetSdkVersion на более высокую версию, если вы не можете протестировать свое приложение на этой версии Android: поскольку я неправильно понял существующие ответы на эту тему admob, я также установил атрибут android:targetSdkVersion для элемента к API-уровню 13 в моем приложении, что вызвало фатальный побочный эффект: поскольку Android 3 думал, что мое приложение будет поддерживать соты, оно больше не отображало кнопку меню на панели мягких кнопок на нижней границе, и поскольку мое приложение скрывает родной строка заголовка, чтобы показать ее собственную реализацию, у пользователя не было никакой возможности получить доступ к меню больше на сотах. Поэтому для меня, оставив targetSdkVersion на уровне 10 удалось вернуть кнопку меню и работать нормально.
  • Обработка обратной совместимости с более старыми API-интерфейсами, которые могут быть потеряны в инструментах SDK 13: ОК, поэтому я установил, что мой процесс сборки использует инструменты SDK 13, а my targetSdkVersion – 10, и все должно быть хорошо, не так ли? К сожалению нет! Причина в том, что мое приложение совместимо с Android 1.5 (API уровня 3), так как это все равно составляет около 5% моих пользователей. К сожалению, после установки цели сборки 13 некоторые части моего кода больше не компилировались, поскольку они ссылались на устаревшие методы, которые поддерживались до SDK-инструментов 10, но больше не начинались с инструментов SDK 11 (например, Service.setForeground ).

Здесь описываются основы обработки обратной совместимости, но в этой статье не описывается, как вызывать устаревшие методы, которые больше не доступны, поскольку они вызовут ошибку компилятора. Я решил это, создав новый проект библиотеки, используемый моим приложением. Для этого проекта библиотеки я установил цель построения обратно в 10, которая заставит ее скомпилироваться с помощью инструментов 10 SDK, которые все еще знают об аннуитетом API, который я использую. Затем мое приложение вызывает вспомогательные методы из этой библиотеки совместимости, поэтому я могу скомпилировать мое приложение с более новым целевым SDK.


Похожие темы

Вот список других связанных дискуссий, которые я нашел:

  • AdMob не может отображать рекламу из-за configChanges
  • AdMob SDK 4.3.1 – я не могу отображать баннер

Моим решением в аналогичном случае было использование

или просто использовать android: targetSdkVersion = до 13

Вам также необходимо установить следующие разрешения в вашем AndroidManifest.xml.

   

Затем admob может оценить Интернет, а также не показывать рекламу, когда у нее нет подключения к интернету.

Вы также установили цель сборки выше Android 3.2, то есть в default.properties установить цель выше, чем у android-13? Также убедитесь, что вы используете последнюю версию SDK.

PS! Не открывайте свой идентификатор устройства публике.

Как вы можете видеть здесь, у очень немногих телефонов установлены версии для Android версии 3.xx или выше

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

Почему кто-то хочет скомпилировать свое приложение к чему-то, что может обрабатывать несколько телефонов? Либо я что-то недопонимаю, либо мне нужно найти другую рекламную компанию, для которой не требуется более новая версия Android.

Выше ошибка возникает, если вы используете библиотеку GoogleAdMobAdsSdk-4.3.1.jar. Я был этой ошибкой, и я нашел эту демонстрацию от Google . Я заменил lib 4.3.1 на 4.0.3 в этой демонстрации, и он работает нормально.

если вы используете AndroidStudio и Gradle, вы также должны обновить файл build.gradle следующим образом:

 android { compileSdkVersion 17 buildToolsVersion "18.0.1" defaultConfig { minSdkVersion 3 targetSdkVersion 17 } ... 
  • Импорт библиотеки google-play-service, показывающей красный X рядом с этим справочным андроидом
  • Как получить идентификатор устройства для Admob
  • Есть ли способ интегрировать Eclipse с Gradle в проект Android?
  • Импорт android.support.v7 невозможен.
  • Что случилось с отладкой в ​​Eclipse на Android?
  • Устройство не обнаружено в Eclipse при подключении к USB-кабелю
  • Устройство LG G3, не распознанное Eclipse на Windows
  • Lint: Как игнорировать « не переводится в »?
  • Как изменить рабочее пространство по умолчанию Eclipse?
  • Ctrl-Space в Eclipse без нажатия Ctrl-пробела
  • Преобразовать существующий проект в проект Android в Eclipse?
  • Interesting Posts

    Компиляция java-программы в исполняемый файл

    Torrent-клиент для Ubuntu похож на uTorrent

    Монитор, не поддерживающий Apple, с DisplayPort не распознается Mac

    Получение уникальных значений в Excel только с использованием формул

    Как проверить, отображается ли один символ в строке?

    Как JVM завершает streamи демона? или Как написать streamи демона, которые заканчиваются изящно

    VT-x включен в BIOS, но отключен в Windows 7

    Редактировать тему получаемого письма в Thunderbird 3.0

    Загрузка файла HTML5 в Java Servlet

    Программное обеспечение для будильника, которое может включить компьютер?

    Как вычислить необходимый оттенок-поворот для генерации определенного цвета?

    Я не могу изменить системные файлы из CMD

    Windows 7 не загружается после запуска окна Windows / застрял на Classpnp.sys в безопасном режиме

    Почему не типичные ограничения типа, наследуемые / иерархически принудительные

    Почему нет оператора для std :: list?

    Давайте будем гением компьютера.