私はまだ解決策があまり好きではありませんが、この問題を解決する何かを思いつきました。誰かがそれを知っていれば、よりエレガントなアプローチを歓迎します。
私がしたことは、AdMob の代わりに mMedia SDK を使用することでした。Interstitial クラスと AdView クラスはどちらも、コンストラクターで Activity ではなく Context を取ることができます。インタースティシャルは、Dream オーバーレイの後ろで開くため、まだうまくいきませんでした。最終的に、Dream の XML レイアウトに AdView を追加し、それを表示したくなるまでその可視性を View.GONE に設定しました。広告を表示するときは、View.VISIBLE に設定します。
私が遭遇したもう 1 つの問題は、AdView をクリックした後、広告の URL を使用してブラウザーを起動することです。これはもちろん、Dream の背後で開き、広告を表示する目的を無効にします。そのため、Dream をインタラクティブに設定し、onTouchEvent をキャッチしました。クリックが発生したときに Ad が VISIBLE の場合は、Ad の callOnClick メソッドを呼び出します。また、Ad の RequestListener を Dream Service に設定し、MMAdOverlayLaunched メソッドを実装する必要がありました。このメソッドは、Ad がブラウザーを起動したときに呼び出されます。このメソッドでは、finish() を呼び出して Dream を停止し、ブラウザに Ad を表示させました。
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
// Exit dream upon user touch
setInteractive(true);
// Hide system UI
setFullscreen(true);
// Set the dream layout
setContentView(R.layout.dream_layout);
//Initialize Ads
this.initAdvertising();
}
private void initAdvertising(){
MMSDK.initialize(this);
mDreamAd = (MMAdView) findViewById(R.id.adView);
//Separate thread will handle showing the ad
mDreamAd.setVisibility(View.GONE);
mAdRequest = new MMRequest();
//TODO add metadata to Request
mDreamAd.setMMRequest(mAdRequest);
mDreamAd.setListener(this);
mDreamAd.getAd();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event){
super.dispatchTouchEvent(event);
if(mDreamAd != null && mDreamAd.isShown()){
mDreamAd.callOnClick();
}
return true;
}
@Override
public void MMAdOverlayLaunched(MMAd ad) {
//Finish so we can display the ad the user has clicked
if(ad.equals(this.mDreamAd))
this.finish();
}