Google Play服务:广告加载问题

时间:2014-09-03 16:06:52

标签: android admob google-play-services

说明 - 我正在将我的应用程序与#34; Google Play Service" SDK根据Google的最新指南。 之前它与独立的admob SDK集成。

ISSUE: - 当展示其中一个时,横幅广告和完整广告会正确显示。但是当两者都必须展示时,它们会产生不可预测的结果。

不可预知的结果? 是的,有时只加载Banner,有时只显示完整广告。它们都很少见。

FIX: - 我尝试在Banner和插页式广告之间做出一些延迟,并且得到了更好的结果。但大多数时候结果仍然无法预测。

  1. 我使用Asynch任务完整广告。在Background()中延迟2秒,并在PostExecute()中加载广告。它给出了更好的结果。但仍然有10次尝试,只展示了7次广告。其余3次为Banner或Full,或者均未加载。
  2. 以下是主要活动

    的代码
    package com.example.adtest_new; 
    import android.app.Activity;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.widget.Toast;
    
    import com.google.android.gms.ads.AdListener;
    import com.google.android.gms.ads.AdRequest;
    import com.google.android.gms.ads.AdView;
    import com.google.android.gms.ads.InterstitialAd;
    
    public class MainActivity extends Activity 
    {
    Context myCont=null;
    private InterstitialAd interstitial = null;
    AdRequest adr;
    
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        //Get the view from activity_main.xml
        setContentView(R.layout.activity_main);
    
        myCont = this;
    
        //--------------BANNER AD----------------------------------     
        //Locate the Banner Ad in activity_main.xml
        AdView adView = (AdView) this.findViewById(R.id.adView); 
        // Request for Ads
        AdRequest adRequest = new AdRequest.Builder().build(); 
        // Load ads into Banner Ads
        adView.loadAd(adRequest);
        //--------------BANNER AD----------------------------------         
    
    //Fix-1 (Did not work)
        try{Thread.sleep(2*1000);}catch(Exception e){}          
    
    //Fix-2 (Did not work)
    //Called Asynch task here(put delay of 2 seconds in background() and loaded full ad in postexecute())
    
        //--------------FULL AD----------------------------------   
        //Prepare the Interstitial Ad
        interstitial = new InterstitialAd(MainActivity.this);        
    
        //Insert the Ad Unit ID
        interstitial.setAdUnitId("ca-app-pub-465697675827xxxx/xxxxxxxxxx");
        adr = new AdRequest.Builder().build();
        //Load ads into Interstitial Ads 
    
        //Prepare an Interstitial Ad Listener
        interstitial.setAdListener(new AdListener() 
        {
            public void onAdLoaded() 
            {
                //System.out.println("!!! Full Ad loaded  !!!");
                Toast.makeText(myCont, "!!! Full Ad loaded  !!!", Toast.LENGTH_SHORT).show();
                //Call displayInterstitial() function
                displayInterstitial();
            }
        });        
        interstitial.loadAd(adr);    
        //--------------FULL AD----------------------------------   
    }    
    
    public void displayInterstitial() {
        // If Ads are loaded, show Interstitial else show nothing.
        if (interstitial.isLoaded()) 
        {
            interstitial.show();
        }
    }
    

    }

    activity_main.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/openedWindows"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >
    
    
    <TextView
        android:id="@+id/completePath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:layout_marginTop="0dp"
        android:layout_marginLeft="3dp"
        android:text="/mnt/sdcard"
        android:textColor="#ff2d8df1"
        android:textSize="16dip"
        android:textStyle="bold"
        android:typeface="sans"/>
    
    <View
    android:id="@+id/bar0"
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_marginTop="0dp"
    android:background="#ffb2cb39"    
    android:layout_marginBottom="0dp"/>
    
    
    
    <View
    android:id="@+id/bar1"
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_marginTop="0dp"
    android:background="#ffb2cb39"    
    android:layout_marginBottom="1dp"/>
    
    
    <RelativeLayout     
    android:id="@+id/temp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent" 
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"   
    android:orientation="vertical">
    
    <Button
        android:id="@+id/selectAll"
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:layout_gravity="left"
        android:layout_marginBottom="1dp"
        android:layout_marginLeft="15dp"
        android:layout_alignParentLeft="true"
        android:background="@drawable/button_green"
        android:textSize="15dip"
        android:text="BUTTON1"
        android:paddingLeft="10px"  
        android:paddingRight="10px"
        android:textColor="#ffffff"
        android:textStyle="bold" />
    
    <Button
        android:id="@+id/selectBtn"
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:layout_marginRight="15dp"
        android:layout_marginBottom="1dp"
        android:layout_alignParentRight="true"
        android:background="@drawable/button_green"
        android:textSize="15dip"
        android:text="BUTTON2"
        android:paddingLeft="10px"  
        android:paddingRight="10px"
        android:textColor="#ffffff"
        android:textStyle="bold" />
    </RelativeLayout>
    
    
    <View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_above="@+id/tableRow2"
    android:background="#444444"    
    android:layout_marginBottom="0dp"/>
    
     <TableRow
     android:id="@+id/tableRow2"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
     <com.google.android.gms.ads.AdView
         xmlns:ads="http://schemas.android.com/apk/res-auto"
         android:id="@+id/adView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         ads:adSize="BANNER"
         ads:adUnitId="ca-app-pub-465697675827xxxx/xxxxxxxxxx"
         />    
    </TableRow>
    
    </LinearLayout>
    

    清单

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.adtest_new"
        android:versionCode="1"
        android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
        <activity android:name="com.google.android.gms.ads.AdActivity"
          android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
        <meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version"/>
    
    </application>
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    </manifest>
    

    请告诉我如何解决这个问题? Standalone admob SDK适用于这两种广告类型。

1 个答案:

答案 0 :(得分:0)

我看到你正在加载&#34;真实&#34;广告(即不是测试广告),因为您没有声明测试设备。我不是100%肯定我会说什么,但这可能是问题的原因。在展示真实广告时,我认为您不会总是有来自Admob / Google Play服务的广告,因此有时您不会展示广告(我认为加载错误代码是3,这是&#34;没有填充&#34; )。您可以在声明测试设备时进行测试,从而导致使用始终可用的测试广告。

此外,建议在开发时使用测试设备,因为如果您在自己的广告上点击很多(错误或只是为了测试),您可能会被禁止使用AdMob。

要了解如何添加测试设备,请参阅此

  

测试广告

     

您应该在开发过程中使用测试广告,以避免产生错误   印象。此外,您始终可以依赖测试广告   可用。通过将散列的设备ID传递给,设置测试广告   AdRequest.Builder.addTestDevice:AdRequest request = new   AdRequest.Builder()       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)//所有模拟器       .addTestDevice(&#34; AC98C820A50B4AD8A2106EDE96FB87D4&#34;)//我的Galaxy Nexus测试手机       .build();

     

logcat将打印dev

     为方便起见,使用ice的MD5哈希ID,例如:使用   AdRequest.Builder.addTestDevice(&#34; AC98C820A50B4AD8A2106EDE96FB87D4&#34;)来   在此设备上获取测试广告。

https://developers.google.com/mobile-ads-sdk/docs/admob/android/banner

如果您的手机不是英文(AdMob test ads shows only on English devices),请注意有人说测试广告无法正常运作

编辑:当然,您应用的真实用户将使用真实广告,因此他们也可能会遇到问题&#34;不总是可用的广告,但这是正常的。您仍然可以重新安排新的加载(对于插页式广告,横幅会定期重新加载)以尝试应对我的想法。

编辑2:顺便说一句,这可能与您的问题有点无关,但人们通常强烈建议不要使用AdListener.onAdLoaded方法显示广告,而是在您希望它出现时手动调用此广告显示(如果isLoaded为true)。但这只是一个符合人体工程学的考虑因素,而不是一个错误的智者