Admob实现错误

oll*_*aus 13 eclipse android 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>
Run Code Online (Sandbox Code Playgroud)

这是我的清单:

<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>
Run Code Online (Sandbox Code Playgroud)

最后这是我的活动:

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();
}}
Run Code Online (Sandbox Code Playgroud)

现在,当我在AdView中启动应用程序时,会出现一个错误:"您必须在AndroidManifest.xml中使用configChanges声明AdActivity."

我使用Android 4.0以上3.2但它不起作用.我希望有人能帮助我.

sve*_*ven 60

获得"你必须在AndroidManifest.xml中使用configChanges声明AdActivity"时,我遇到了同样的问题.集成最新的AdMob SDK后出现错误消息.虽然我已经在StackOverflow上找到了这个以及另外两个相关的讨论(参见本文底部的链接),但它们并没有帮助我解决这个问题,因为 - 对我而言 - 他们之间没有区分清楚targetSdkVersion清单和构建目标中的属性.这个答案描述了为我解决问题的原因以及造成麻烦的原因.

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

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
Run Code Online (Sandbox Code Playgroud)

第二个 - 也是更复杂的部分 - 与SDK目标相关:唯一真正有效的解决方案是使用SDK管理器至少安装Android 3.2(API级别13)的SDK.安装此SDK版本后,需要配置IDE以使用此SDK构建项目.确切的设置取决于您使用的IDE.在我的例子中,它是IntelliJ IDEA,你可以在标题Project SDK下面的Project页面的项目设置中找到该选项.

您还应该调整target项目中的属性project.properties.如果您使用ANT构建版本,这至少是重要的.该行应如下所示:

target=android-13
Run Code Online (Sandbox Code Playgroud)

仅上面的配置就可以解决问题.有没有需要改变<uses-sdk>的AndroidManifest元素.阅读下面的陷阱,了解为什么这可能会导致麻烦.

说明

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

构建目标是评估在编译时通过您的构建工具,以确定您的系统上的SDK工具,版本应该用于构建应用程序.SDK越新,它就知道的API功能越多.出于任何原因,Google强制我们指定一些configChanges在API级别13之前不可用的内容,因此我们需要使用至少SDK工具13来构建我们的应用程序,因为以前版本的SDK工具不知道这些新的configChanges并且将报告一个错误.在运行时,构建目标没有任何意义,Android将忽略configChanges它不知道的所有元素(例如).

相比之下<uses-sdk>,在android清单中的元素上指定的targetSdkVersion元素在运行时进行评估 - 而不是在编译时进行评估.实际上,您可以在此处指定任何值,而无需编译器更改任何内容或显示错误消息.这就是更改此属性无法帮助我们解决AdMob问题的原因.另一方面,在运行时,该属性可以由android评估,以支持针对较旧的Android版本构建的应用程序的一些兼容性功能.请参阅下面的陷阱部分,以查看给我带来麻烦的主题.

陷阱

  • 不要更改设置targetSdkVersion,如果你不能够测试在这个Android版本的应用程序到更高版本:因为我有误解对此AdMob的话题我也设置了现有的答案android:targetSdkVersion的属性<uses-sdk>元素API级别13在我的应用程序,它造成致命的副作用:由于Android 3认为我的应用程序原生支持蜂窝,它不再显示底部边框的软按钮栏中的菜单按钮,并且我的应用程序隐藏了原生标题栏以显示它自己的实现用户没有任何可能在蜂窝上访问菜单的可能性.因此,对于我离开targetSdkVersionat级别10有助于恢复菜单按钮并且工作正常.
  • 处理可能在SDK工具中丢失的旧API的向后兼容性13:好的,所以我将构建过程设置为使用SDK工具13和my targetSdkVersion到10,一切都应该没问题,对吧?不幸的是不!原因是,我的应用程序向下兼容到Android 1.5(API级别3),因为这仍占我用户的5%左右.不幸的是,在将构建目标设置为13后,我的代码的某些部分不再编译,因为它们引用了在SDK工具10之前支持但不再使用SDK工具11(例如Service.setForeground)的支持的弃用方法.

这里描述如何处理向后兼容性的基础知识- 但是本文没有描述如何调用不再可用的弃用方法,因为它们会导致编译器错误.我通过创建我的应用程序使用的新库项目来解决这个问题.对于这个库项目,我已经将构建目标设置回10,这将导致它使用SDK工具10进行编译,这些工具仍然知道我正在使用的android弃用的API.我的应用程序然后调用此兼容性库中的帮助程序方法,因此我可以使用较新的目标SDK编译我的应用程序.


相关话题

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