Подтвердить что ты не робот

Ошибка реализации 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, но он не работает. Я надеюсь, что кто-нибудь сможет мне помочь.

4b9b3361

Ответ 1

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

Решение

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

<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 SDK.

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

target=android-13

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

Описание

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

Цель build оценивается только по времени сборки средствами сборки, чтобы определить, какая версия инструментов 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 и мои targetSdkVersion до 10, и все должно будь прав, верно? К сожалению нет! Причина в том, что мое приложение совместимо с Android 1.5 (API уровня 3), так как это все равно составляет около 5% моих пользователей. К сожалению, после установки цели сборки 13 некоторые части моего кода больше не компилировались, поскольку они ссылались на устаревшие методы, которые поддерживались до SDK-инструментов 10, но больше не начинались с инструментов SDK 11 (например, Service.setForeground).

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


Смежные темы

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

android {
    compileSdkVersion 17
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 3
        targetSdkVersion 17
    }
...