我在获取“您必须使用 configChanges 在 AndroidManifest.xml 中声明 AdActivity”时遇到了完全相同的问题。集成最新的AdMob SDK后出现错误消息。尽管我在 StackOverflow 上找到了这个问题以及其他两个相关的讨论(请参阅本文底部的链接),但它们并没有帮助我解决问题,因为对我来说,它们没有足够清楚地区分这targetSdkVersion
清单和构建目标中的属性。这个答案描述了是什么为我解决了问题以及是什么造成了麻烦。
Solution
首先最简单的部分:您缺少一些标志configChanges
定义的属性AdActivity
在你的AndroidManifest.xml
。如图所示AdMob SDK 文档 http://code.google.com/intl/de-DE/mobile/ads/docs/android/fundamentals.html定义需要如下所示:
<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
第二个(也是更复杂的部分)与 SDK 目标相关:唯一似乎真正有效的解决方案是使用 SDK 管理器安装至少适用于 Android 3.2(API 级别 13)的 SDK。安装此 SDK 版本后,您需要配置 IDE 以使用此 SDK 构建项目。确切的设置取决于您使用的 IDE。就我而言,它是 IntelliJ IDEA,您可以在项目设置中找到该选项Project标题下方的页面项目SDK.
您还应该调整target
您项目中的属性project.properties
。如果您使用 ANT 构建版本,这一点至少很重要。该行应如下所示:
target=android-13
仅上面的配置就可以解决问题。有no所需的改变<uses-sdk>
AndroidManifest.xml 中的元素阅读下面的陷阱,了解为什么这可能会导致麻烦。
解释
构建目标和<uses-sdk>
元素具有完全不同的范围。
The 构建目标被评估only在构建时,由构建工具确定应使用系统上哪个版本的 SDK 工具来构建应用程序。 SDK 越新,它了解的 API 功能就越多。出于某种原因,谷歌强迫我们指定一些configChanges
在 API 级别 13 之前不可用,因此我们需要至少使用 SDK 工具 13 来构建我们的应用程序,因为以前版本的 SDK 工具不知道这些新的configChanges
并会报错。在运行时,构建目标没有任何意义,Android 将忽略所有元素(例如,configChanges
)它不知道。
The 目标SdkVersion上指定的元素<uses-sdk>
相比之下,android 清单中的元素是only在运行时评估——not在编译时。事实上,您可以在此处指定任何您想要的值,而编译器不会更改任何内容或显示错误消息。这就是为什么更改此属性并不能帮助我们解决 AdMob 问题。另一方面,在运行时,android 可能会评估该属性,以支持为旧 Android 版本构建的应用程序的某些兼容性功能。请参阅下面的陷阱部分,了解给我带来麻烦的主题。
Pitfalls
-
Do not变更集
targetSdkVersion
如果您无法在此 Android 版本上测试您的应用程序,请升级到更高版本:因为我误解了有关此 admob 主题的现有答案,所以我还设置了android:targetSdkVersion
的属性<uses-sdk>
我的应用程序中的 API 级别 13 元素,这导致了致命的副作用:由于 Android 3 认为我的应用程序本机支持蜂窝,因此它不再在底部边框的软按钮栏中显示菜单按钮,并且我的应用程序隐藏了本机标题栏显示它自己的实现,用户无法再访问蜂窝上的菜单。所以对我来说离开targetSdkVersion
处于水平10
帮助恢复菜单按钮并且工作正常。
-
处理对较旧 API 的向后兼容性,这些 API 可能在 SDK 工具 13 中丢失:好的,所以我已经将构建过程设置为使用 SDK 工具 13 和我的
targetSdkVersion
到 10 一切都应该没问题,对吧?不幸的是没有!原因是,我的应用程序向下兼容 Android 1.5(API 级别 3),因为这仍然占我用户的 5% 左右。不幸的是,将构建目标设置为 13 后,我的代码的某些部分不再编译,因为它们引用了已弃用的方法,这些方法直到 SDK 工具 10 才受支持,但不再从 SDK 工具 11 开始(例如Service.setForeground
).
描述了如何处理向后兼容性的基础知识here http://developer.android.com/resources/articles/backward-compatibility.html-- 但本文不描述如何调用不再可用的已弃用方法,因为它们会导致编译器错误。我通过创建一个由我的应用程序使用的新库项目解决了这个问题。对于这个库项目,我已将构建目标设置回 10,这将导致使用 SDK 工具 10 对其进行编译,该工具仍然了解我正在使用的 Android 已弃用的 API。然后,我的应用程序从该兼容性库调用辅助方法,这样我就可以使用更新的目标 SDK 编译我的应用程序。
相关话题
这是我发现的其他相关讨论的列表:
- 由于 configChanges,AdMob 无法展示广告 https://stackoverflow.com/q/7902121/280384
- AdMob SDK 4.3.1 - 我无法显示横幅 https://stackoverflow.com/q/7901018/280384