AdMob interstitial Ad is shown but can't click

2019-05-01 04:36发布

问题:

I've got an app that displays an Interstitial Ad when certain activity is closed. I use a different activity to show the Ad. So far it shows the Ad correctly but nothing happens when I click on the Ad. I've tested it on many devices and beta testers report the same behavior. There are no errors in the logs. It's the same if I use debug build or signed APK that is uploaded to the play store (it's published in alpha state if it matters). I use the latest Play Store Services SDK.

What could be the reason for this?

My activity that shows the Ad (I use the correct unit id in the actual code)

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

public class AdFullScreen extends Activity {

    private static final String TAG = "AdFullScreen";
    private static final String AD_UNIT_ID = "my-unit-id";

    private InterstitialAd interstitialAd;
    ProgressBar prgrssBrAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.ad_layout);

        prgrssBrAd = (ProgressBar) findViewById(R.id.prgrssBrAd);

        interstitialAd = new InterstitialAd(this);
        interstitialAd.setAdUnitId(AD_UNIT_ID);

        interstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                Log.e(TAG, "onAdLoaded");
                prgrssBrAd.setVisibility(View.GONE);
                if (interstitialAd.isLoaded()) {
                    interstitialAd.show();
                } else {
                    Log.e(TAG, "Interstitial ad was not ready to be shown.");
                    finish();
                    return;
                }
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                String message = String.format("onAdFailedToLoad (%s)",
                        getErrorReason(errorCode));
                Log.e(TAG, message);
                finish();
                return;
            }

            @Override
            public void onAdClosed() {
                finish();
                return;
            }

            @Override
            public void onAdLeftApplication() {
                Log.e(TAG, "onAdLeftApplication");
                finish();
                return;
            }

        });

        LocationManager locationManager = (LocationManager) this
                .getSystemService(Context.LOCATION_SERVICE);
        String locationProvider = LocationManager.GPS_PROVIDER;
        Location lastKnownLocation = locationManager
                .getLastKnownLocation(locationProvider);
        if (lastKnownLocation == null) {
            locationProvider = LocationManager.NETWORK_PROVIDER;
            lastKnownLocation = locationManager
                    .getLastKnownLocation(locationProvider);
            Log.e(TAG, "Last location not available by GPS");
        } else {
            Log.e(TAG, "Last location available by GPS");
        }

        // Check the logcat output for your hashed device ID to get test ads on
        // a physical device.
        AdRequest.Builder bldr = new AdRequest.Builder();

        if (lastKnownLocation != null) {
            Log.e(TAG, "Last location available");
            bldr.setLocation(lastKnownLocation);
        } else {
            Log.e(TAG, "Last location not available by any provider");
        }
        AdRequest adRequest = bldr.build();
        // Load the interstitial ad.
        interstitialAd.loadAd(adRequest);
    }

    @Override
    public void onStart() {
        super.onStart();
        // The rest of your onStart() code.
    }

    @Override
    public void onStop() {
        super.onStop();
        // The rest of your onStop() code.
    }

    /** Gets a string error reason from an error code. */
    private String getErrorReason(int errorCode) {
        String errorReason = "";
        switch (errorCode) {
        case AdRequest.ERROR_CODE_INTERNAL_ERROR:
            errorReason = "Internal error";
            break;
        case AdRequest.ERROR_CODE_INVALID_REQUEST:
            errorReason = "Invalid request";
            break;
        case AdRequest.ERROR_CODE_NETWORK_ERROR:
            errorReason = "Network Error";
            break;
        case AdRequest.ERROR_CODE_NO_FILL:
            errorReason = "No fill";
            break;
        }
        return errorReason;
    }
}

The layout (I've tried to not use any layouts with same results).

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ProgressBar
        android:id="@+id/prgrssBrAd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

I would appreciate any help you can provide.

UPDATE

It seems that I managed to find the problem. It was related to the AndroidManifest configuration: Old one, Ads are not clickable:

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

Good one, works fine:

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

Sorry for the confusion, I cant recall when I did that change.

回答1:

it will work definitely

public class AdFullScreen extends Activity implements AdListener {      


private InterstitialAd interstitial;
private String MY_INTERSTITIAL_UNIT_ID = "your unit id here";

@Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.ad_layout);

 interstitial = new InterstitialAd(this, MY_INTERSTITIAL_UNIT_ID);
    // Create ad request
    AdRequest adRequest = new AdRequest();
    // Begin loading your interstitial
    interstitial.loadAd(adRequest);
    // Set Ad Listener to use the callbacks below
    interstitial.setAdListener((AdListener) this);

@Override
public void onDismissScreen(Ad arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
    // TODO Auto-generated method stub

}

@Override
public void onLeaveApplication(Ad arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onPresentScreen(Ad arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onReceiveAd(Ad add) {
    // TODO Auto-generated method stub
    if (add == interstitial) {

        interstitial.show();
    }
}


标签: android admob