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中启动应用程序时,会出现一个错误:“您必须在AndroidManifest.xml中使用configChanges声明AdActivity。

我使用Android 4.0以上3.2,但它不工作。 我希望任何人都可以帮助我。

我得到了“你必须在AndroidManifest.xml中用configChanges声明AdActivity”的问题。 集成最新的AdMob SDK后出现错误消息。 尽pipe我已经在StackOverflow中find了这个以及另外两个相关的讨论(参见本文底部的链接),但他们并没有帮我解决这个问题,对于我来说,他们之间没有足够的区分清单中的targetSdkVersion属性和构build目标。 这个答案描述了什么解决了我的问题,是什么造成了麻烦。

最简单的部分是:你在AndroidManifest.xml中的AdActivity的定义的configChanges属性中缺less一些标志。 如AdMob SDK文档所示,定义需要如下所示:

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

第二个也是更复杂的部分与SDK目标相关:唯一的解决scheme似乎是使用SDKpipe理器来安装至lessAndroid 3.2(API级别13)的SDK。 安装此SDK版本后,您需要configurationIDE以使用此SDK构build项目。 确切的设置取决于您使用的IDE。 在我的情况下,它是IntelliJ IDEA,你可以在标题为Project SDK项目页面的项目设置中find选项。

您还应该调整项目的project.propertiestarget属性。 如果您使用ANT构build您的版本,这至less很重要。 该行应该是这样的:

 target=android-13 

上面的configuration本身就是诀窍。 AndroidManifest中的<uses-sdk>元素不需要更改。 阅读下面的陷阱,了解为什么这可能会造成麻烦。

说明

构build目标和<uses-sdk>元素具有完全不同的范围。

构build目标 在构build时由您的构build工具评估,以确定应使用系统上哪些版本的SDK工具构build应用程序。 SDK越新,API知识就越多。 出于任何原因,谷歌迫使我们指定一些在API级别13之前不可用的configChanges ,所以我们需要使用至lessSDK工具13来构build我们的应用程序,因为以前版本的SDK工具不知道这些新的configChanges和会报错。 在运行时,构build目标没有任何意义,Android会忽略它不知道的所有元素(例如在configChanges )。

android清单中的<uses-sdk>元素指定的targetSdkVersion元素只是在运行时计算 – 而不是在编译时。 事实上,你可以在这里指定你想要的任何值,而不需要编译器改变任何东西或者引发错误信息。 这就是为什么更改此属性并不能帮助我们解决AdMob问题。 另一方面,在运行时,该属性可以由android来评估,以支持针对较早的android版本构build的应用的一些兼容性特征。 看到下面的陷阱部分,看到一个话题,造成我的麻烦。

陷阱

  • 如果您无法在此Android版本上testing您的应用程序,请不要将targetSdkVersion设置为更高版本:由于我误解了有关此admob主题的现有答案,我还设置了<uses-sdk>android:targetSdkVersion属性,元素到我的应用程序中的API级别13,导致了一个致命的副作用:Android 3认为我的应用程序本来会支持蜂窝,它不再显示底部边框的软button栏中的菜单button,因为我的应用程序隐藏本地标题栏来显示它自己的实现,用户没有任何可能访问蜂窝上的菜单了。 所以对于我来说,将targetSdkVersion留在10级有助于恢复菜单button并且工作正常。
  • 处理向后兼容可能在SDK工具中丢失的旧API 13:好吧,所以我已经设置了我的构build过程使用SDK工具13和我的targetSdkVersion到10,一切都应该没问题吧? 不幸的不是! 原因是,我的应用程序向下兼容Android 1.5(API级别3),因为这仍占我用户的5%左右。 不幸的是,在将构build目标设置为13之后,我的代码的某些部分不再编译,因为它们引用了直到SDK工具10支持但不再以SDK工具11(例如Service.setForeground )开始的不推荐使用的方法。

这里描述了如何处理向后兼容性的基础知识 – 但是这篇文章并没有介绍如何调用不再可用的废弃的方法,因为它们会导致编译器错误。 我通过创build一个由我的应用程序使用的新库项目来解决此问题。 对于这个库项目,我已经将构build目标设置回10,这将导致它被编译使用SDK工具10,仍然知道我使用的Android弃用的API。 然后,我的应用程序从这个兼容库中调用助手方法,所以我可以用一个更新的目标SDK编译我的应用程序。


相关话题

这里列出了我发现的其他相关讨论:

  • 由于configChanges,AdMob无法展示广告
  • AdMob SDK 4.3.1 – 我无法显示横幅广告

我对类似案例的解决scheme是使用

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

或者在13下使用android:targetSdkVersion =

您还需要在AndroidManifest.xml中设置以下权限。

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

然后admob可以评估互联网,也不显示广告,当它没有互联网连接。

你还设置你的构build目标高于Android 3.2,即在default.properties设置目标高于android-13吗? 另外请确保您使用的是最新版本的SDK。

PS! 不要将您的设备ID暴露给公众。

正如你在这里看到的,很less有手机安装3.xx或更高版本的Android版本

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

为什么有人想编译他们的应用程序,几个手机可以处理? 要么我误解了一些东西,要么find一些不需要更新的Android版本的广告公司。

当您使用GoogleAdMobAdsSdk-4.3.1.jar库时,会发生上述错误。 我一直在这个错误,我发现了谷歌的这个演示 。 我已经在这个演示中用4.0.3replace了lib 4.3.1,它运行正常。

如果你使用AndroidStudio和Gradle,你也必须像这样更新build.gradle文件:

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