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

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

Это мой main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout> </LinearLayout> 

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

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.ollidiemaus.testmob" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".TestAdmobActivity" > <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"/> </application> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> </manifest> 

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

 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, определение должно выглядеть так:

 <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> 

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

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

 target=android-13 

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

объяснение

Объект сборки и элементы <uses-sdk> имеют совершенно разные области.

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

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

Ловушки

  • Не изменяйте set targetSdkVersion на более высокую версию, если вы не можете протестировать свое приложение на этой версии Android: поскольку я неправильно понял существующие ответы на эту тему admob, я также установил атрибут android:targetSdkVersion для <uses-sdk> Элемент к уровню 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 – я не могу отображать баннер

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

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="11" />

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

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

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

Затем 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 } ...